LoginSignup
9
9

More than 3 years have passed since last update.

SplFileObject::fputcsv()で改行コード=CR+LFのCSVを出力する方法

Posted at

PHPにはSplFileObjectというファイル操作用のクラスが標準で提供されています。
PHP5.4からはfputcsvというCSV出力用のメソッドも用意されていますが、このメソッドはLinux環境では改行コードがLFで出力されるようになっています。

今回はSplFileObject::fputcsvを使用してCR+LFのCSVを出力する方法をご紹介します。

環境

PHP 7.3.9

方法

stream_filter_registerphp://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

9
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9