2012-04-19 81 views
0

进出口达导出CSV文件,分隔符为“”逗号但即时通讯有一个问题,如果栏目内容有逗号,这将打破CSV出来放时在自由办公室计算。如何逃脱从列内容的分隔符时导出CSV

,如果任何机构可以帮助我这里怎么解决这个

IM高达现在

//$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; 
+1

如果这是Perl的我会说“用文字:: CSV” ......不PHP有一个CSV库中可用?车轮改造通常不是一个好主意,而CVS一代是一个相当常见的车轮。 – Quentin 2012-04-19 11:17:12

回答

4

只要使用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,但在这种情况下,您必须打开文件并在自己阅读后进行清理。

+0

谢谢答复+1 – 2012-04-19 11:26:08

+0

这个事情的问题我的客户想在它生成后下载csv – 2012-04-19 11:32:08

+0

@Roshan更新了我的答案。 – Fabio 2012-04-19 11:44:00

2

通常的办法是包片的数据与一对"和使用""来表示数据中的双引号字符。

foo,bar,"sometimes you get data containing a "","" character","23,000" 
+0

感谢您的回复+1 – 2012-04-19 11:26:19

+0

请你能告诉我这样做的方法 – 2012-04-19 11:31:17

+0

字符串替换'''字符,然后echo'“$”foo \“”'。 – Quentin 2012-04-19 11:49:46

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'