2


5

CSVファイルを生成するPHPファイル、テキストを正しく出力する方法

現在、MySQLデータベースのエントリからCSVファイルを出力するPHPスクリプトに取り組んでいます。 私の問題は、値を正しく出力する方法にあります。 MySQLデータベースのエントリの多くには、カンマと引用符が含まれます。これらを単純にファイルに出力すると、CSVファイルの形式が破壊されます。

テキストを引用符で囲むことができることは承知していますが、引用符を含むエントリはファイルの形式を台無しにします。

私の質問は、これが起こらないようにするにはどうすればよいですか?

また、改行はファイルの解釈に影響しますか?

また、PHPではfputcsv関数を使用しません。 新しいファイルに書き込むのではなく、PHPスクリプトにファイルの内容(適切なヘッダー付き)を出力させようとしています。

前もって感謝します!

よろしく、celestialorb

3 Answer


6


fputcsvの解任は時期尚早だったかもしれません。 fputcsvマニュアルのコメントには、ファイルではなくfputcsvを使用してブラウザに出力する例があります。 http://php.net/manual/en/function.fputcsv.php

ここにそのコードと、実際にユーザーにcsvファイルをダウンロードするように促すことを示すヘッダーを示します。

$mydata = array(
 array('data11', 'data12', 'data13'),
 array('data21', 'data22', 'data23'),
 array('data31', 'data32', 'data23'));
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"my-data.csv\"");
outputCSV($mydata);

function outputCSV($data) {
    $outstream = fopen("php://output", 'w');
    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals, ';', '"');
    }
    array_walk($data, '__outputCSV', $outstream);
    fclose($outstream);
}


0


これらの状況では、タブ区切りの値ファイルが役立つことがわかりました。 TSVは、データ内のコンマなどの問題の影響を受けにくくなっています。


0


このプロセスは_escaping_と呼ばれ、ほとんどのパーサー(PHPを含む)はバックスラッシュを使用して文字をエスケープします。

"This string contains literal \"quotes\" denoted by backslashes"

http://www.php.net/manual/en/function.addcslashes.php [addcslashes]を使用して、文字列内の文字をエスケープできます。

// escape double-quotes
$string = addcslashes('this string contains "quotes"', '"');

echo $string; // 'this string contains \"quotes\"'

コンマで区切るデータの配列を指定すると、次のことができます。

// Escape all double-quotes
foreach ($data as $key => $value)
  $data[$key] = addcslashes($value, '"');

// Wrap each element in double quotes
echo '"' . implode('", "', $data), '"';