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

calender 2022.6.3   account Sena

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 / Engineer

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

Company name and Fourier's iconic logo

株式会社フーリエは、インターネット軸にICT(情報通信技術)を通じて「生活をもっと便利に、企業をもっと活動的に」するため、デジタルと現実社会で流れる情報の『繋ぎ手』として、ICTを利活用した企業活動の調査分析から企画・プロモーション・開発・運営まで総合的に支援しています。

コーポレートサイトを見る