我要导出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;
答案 0 :(得分: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但是在这种情况下你必须打开文件并在自己阅读之后进行清理。
答案 1 :(得分:2)
通常的方法是用一对"
包裹数据,并使用""
来表示数据中的双引号字符。
foo,bar,"sometimes you get data containing a "","" character","23,000"
答案 2 :(得分:1)
答案 3 :(得分:0)
您可以使用SELECT .. INTO OUTFILE从查询中执行此操作 e.g。
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'