Produced by Fourier

UTF-8BOM有無両対応のCSVファイル読み込み(PHP)

Sena Sena カレンダーアイコン 2022.06.03

CSVで読み込んで何か処理をするという依頼は多いのですが、Excelの出力にはBOMが付きものなので、CSV読み込みはなかなかストレートにはいきません。

一般的に、UTF-8のBOM付き・無しについては、マニアックな知識になってしまうため、運用に説明するよりもそもそもBOM両対応のCSV読み込み機構を用意してしまえば話ははやい。ということで、今回作成しました。(PHPでの実装です)

方法

ネット上には、先人たちの貴重な資産(コード)が転がっていますので、さっとコピペで済まそうと思いましたが、 preg_match 等を使って読み込んだCSVファイルを編集(BOM削除)してから、再度読み込む方法が多かったです。

それでも動けば良いのですが、CSVのファイルサイズが大きいとメモリ使用量への影響が懸念されますので、 今回、ファイルポインタを使いBOMの部分をスルーして読み込む方法を試みます。

コード

/**
 * UTF-8のCSVを読み込み(BOM有無両対応)
 *
 * @param \SplFileObject $file CSVファイル
 */
function readCSV(\SplFileObject $file) {
		if ($file->fread(3) !== pack('C*', 0xEF, 0xBB, 0xBF)) {
		    // BOMが無いので、ポインタを先端に戻す(freadを実行するとポインタが動く事に注意)
		    $file->rewind();
		}
		for ($i = 0; !$file->eof(); ++$i) {
        $line = $file->fgetcsv();
        // 行毎の処理
		}
}

PHPなのに若干C言語臭いので、あまり綺麗なコードでは無いかも知れません。

Sena

Sena slash forward icon Engineer

生涯に亘り技術を極めていきたい。

関連記事