2012-04-19 62 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'