PHPのSplFileObjectを使ってCSVファイルの操作




概要

PHPのSplFileObjectクラスを使ってCSVファイルの操作を行う基本的な手順をまとめます。

CSVファイルの読み込み

CSVファイルの読み込みは以下で簡単に読み込むことができます。

ただし、やりたいことによってsetFlags()の内容が変わって来るのでここはよく考えて設定が必要です。
下の方にTipsとしてまとめています。

CSVファイルの書き込み

書き込みも大して難しいことはなく、以下で書き込めます。
書き込みは1行ずつ行います。

SplFileObjectに関するTips

[Tips1]CSVの空行を読み込まないようにする

何も設定しないと空行が読み込まれます。SplFileObjectのfputcsv()で出力したCSVファイルの最終行も空行があり、デフォルト設定だと最終行の空行も読み込まれます。
空行を読み込まないようにするためにはSplFileObject::READ_AHEAD、SplFileObject::SKIP_EMPTYを両方設定すると空行は読み飛ばすことができます。

[Tips2]改行コードを削除する

フィールド内の改行コードを削除する必要がある場合、SplFileObject::DROP_NEW_LINEを設定することで改行コードを削除することができます。
マニュアルには「行末の改行を読み飛ばします」と書いてありますが、行末でなくても改行コードはすべて取り除かれました。
英語だと「Drop newlines at the end of a line.」と書いてあるのだが、すべて取り除くという意味?英語はそこまで達者ではないのでわかりません。。
PHP7.2系でも改行コードはすべて取り除かれました。

[Tips3]全行数を取得する

行数は以下のページに書いてありますが、ポインタを最終行に移動させて行番号を取得する方法となります。
ただし、ファイルの行数が多くなると処理が重くなりますので注意。
CSVファイルでそんなに行数が多いデータを扱うことは少ないとは思いますが。

SplFileObject::seek
http://php.net/manual/ja/splfileobject.seek.php

SplFileObjectのSplってなんの略?

Splがなんの略か気になったので調べてみると、「Standard PHP Library」の略だったんですね。

Standard PHP Library (SPL)
http://php.net/manual/ja/book.spl.php

SplFileObject::READ_AHEADのパフォーマンス

これ気になって調べたかったのですが、結論にたどり着きませんでした。
SplFileObject::READ_AHEADを設定した場合、メモリ上に一度CSVファイルの内容を読み込むのかと思ったのですが、そういうわけでもなさそうでいまいち理解できず、PHPのソースをみてみましたが当たりがついただけで解析するには時間がかかりすぎるので、この件は後日時間を作って調べてみたいと思います。

区切り文字、囲み文字、エスケープ文字を変更

区切り文字、囲み文字、エスケープ文字はそれぞれデフォルトでは「,」「”」「\」になっています。
これを変更するにはSplFileObject::setCsvControlメソッドで各種設定変更ができます。

最後に

基本的な機能しか使っていないのですが、今まで使ってきた中では困ったことがなかったので今後も利用していこうと思っています。

参照

PHPマニュアル > SplFileObject クラス
https://php.net/manual/ja/class.splfileobject.php