PHP fputcsvの改行コードをCRLFで出力

PHP のfputcsv関数で出力した CSV ファイルの各行の改行コードは LF なんですね。
記憶の片隅に残しておかないと、改行コードに CRLF を期待しているシステムで読み込めませんなんてことになってしまいます。 😉

改行に CRLF を出力する方法は、いろいろあると思いますが、php_user_filter を使った方法がスマートに思えます。
フィルタをつくって、stream_filter_register で登録、開いたストリームに stream_filter_append で追加すると、読み込みまたは書き込み時にフィルタが適用されます。

// filter class that applies CRLF line endings
class crlf_filter extends php_user_filter
{
    function filter($in, $out, &$consumed, $closing)
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            // make sure the line endings aren't already CRLF
            $bucket->data = preg_replace("/(?data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

// フィルタの登録
stream_filter_register('crlf', 'crlf_filter');

// 出力ファイルのオープン
$fp = fopen($foldername."/".$filename, 'w');

// 出力ファイルへフィルタをアタァッチ
stream_filter_append($fp, 'crlf');

while(繰り返す) {
    $output = array();
... 省略 ...
    // 出力
    fputcsv($fp, $output);
}

// 出力ファイルのクローズ
fclose($fp);

参考:
stream_filter_register
https://stackoverflow.com/questions/12722894/how-can-i-change-the-line-endings-used-by-fputcsv

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください