1

CSVファイルをエクスポートする場合、区切り文字は「、」コンマですが、列の内容にコンマが含まれていると問題が発生します。libreofficecalcを参照すると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で出力できます。tmpfileはリソースを返すため、freadを使用する必要があります。それ以外の場合は、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 ..INTOOUTFILEを使用してクエリから実行できます。

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 に答える