1

我要导出 CSV 文件,分隔符是“,”逗号,但如果列内容有逗号,则会出现问题,在查看 libre office calc 时会破坏 csv 输出。

如果有任何机构可以帮助我如何解决这个问题

我到现在为止

//$filename = $row['fileName'].'-ConsignmentInfo.csv';
$filename="test.csv";
$delim = ',';
$columns = array('0Product_Number', 'Product_Name', 'Alternative_Title');
echo implode($delim,$columns )."\n";           

$ptr1 = DD_Db::fetch("SELECT p.pNum,p.pName,a.varcharValue FROM ds_products p   left join productAttribute a on a.id=p.pID where a.attributeId= (select id FROM attribute where attributeName='alternateTitle') ");

 foreach ($ptr1 as $row) {
      $line = array("\"{$row['pNum']}\"","\"{$row['pName']}\"","\"{$row['varcharValue']}\"");
      echo implode($delim,$line)."\n";
 }

header('Content-Type: text/csv');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header('Content-Disposition: attachment; filename='.$filename);
header('Pragma: cache');
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
exit;
4

4 回答 4

5

只需使用fputcsv它负责转义并生成正确的 csv 数据。

<?php

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach ($list as $fields) {
    fputcsv($fp, $fields);
}

fclose($fp);
?>

输出:

aaa,bbb,ccc,dddd
123,456,789
"""aaa""","""bbb"""

编辑

您始终可以使用tmpfile的组合打开一个文件,该文件将在请求结束时自动删除,写入该文件,然后在创建报告后使用fread输出其内容。您必须使用 fread 因为 tmpfile 返回资源,否则您可以使用tempnam + file_get_contents但在这种情况下,您必须打开文件并在自己阅读后进行清理。

于 2012-04-19T11:18:49.850 回答
2

通常的做法是用一对包裹数据,"用来""表示数据中的双引号字符。

foo,bar,"sometimes you get data containing a "","" character","23,000"
于 2012-04-19T11:16:28.230 回答
1

将值放在引号中。

http://pt.wikipedia.org/wiki/Comma-separated_values

于 2012-04-19T11:17:21.260 回答
0

您可以使用SELECT .. INTO OUTFILE从查询中执行此操作, 例如

SELECT p.pNum, p.pName, a.varcharValue
FROM ds_products p   
LEFT JOIN productAttribute a ON a.id=p.pID 
WHERE a.attributeId = (select id FROM attribute where attributeName='alternateTitle')
INTO OUTFILE '/path/on/server'

如果要添加标题行:

SELECT 'A', 'B', 'C'
UNION
SELECT p.pNum, p.pName, a.varcharValue
FROM ds_products p   
LEFT JOIN productAttribute a ON a.id=p.pID 
WHERE a.attributeId = (select id FROM attribute where attributeName='alternateTitle')
INTO OUTFILE '/path/on/server'
于 2012-04-19T11:33:19.620 回答