PHPにはSplFileObjectというファイル操作用のクラスが標準で提供されています。
PHP5.4からはfputcsvというCSV出力用のメソッドも用意されていますが、このメソッドはLinux環境では改行コードがLF
で出力されるようになっています。
今回はSplFileObject::fputcsv
を使用してCR+LF
のCSVを出力する方法をご紹介します。
環境
PHP 7.3.9
方法
stream_filter_registerとphp://filterストリームを組み合わせることで、CR+LF
のCSVを出力することができます。
<?php
$data = [
['東京都', '千代田区'],
['神奈川県', '横浜市'],
['埼玉県', '埼玉市'],
];
// 末尾改行コードをCR+LFにするフィルタクラスをストリームフィルタとして登録
stream_filter_register('CrlfFilter', CrlfFilter::class);
// php://filterストリームで登録したフィルタを設定する
$file = new SplFileObject('php://filter/write=CrlfFilter/resource=php://output', 'wb');
foreach ($data as $row) {
$file->fputcsv($row);
}
class CrlfFilter
{
public function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
$bucket->data = preg_replace("/\n$/", '', $bucket->data);
$bucket->data = preg_replace("/\r$/", '', $bucket->data);
$bucket->data = $bucket->data . "\r\n";
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
参考サイト
fputcsv の改行コードを CR+LF にするには
Stream Filtering with SplFileObject