PHP – CSV – 読み込み – SplFileObject

概要

SplFileObjectによるCSVファイルの読み込みについて整理する。手順概略は以下のとおり。

  • ファイル名を指定してSplFileObjectのインスタンスを生成
    • $file = new \SplFileObject('csvファイルパス');
    • $open_modeはデフォルト値の'r'(読み込み)
  • CSV読み込みのためのフラグをセット
    • $file.setFlags(...);
  • ファイルを読み込み
    • foreachで行単位データを取得
    • 行データは各フィールド値を要素とする配列

なお、Splは”Standard PHP Library”の略。

基本例~一括読み込み

例として、GETリクエストに応じて所定の場所に配置されたCSVファイルを読みだし、行データを要素とする配列に格納し、その内容をブラウザーに表示するアプリケーションを考える。

CSVファイルの配置

storage/app/ディレクトリーにCSVファイルを配置した場合は、storage_path()関数にstorageディレクトリーを基準としたパスを指定してフルパスを得ることができる。

たとえば以下の内容のファイルをstorage/app/csv_sample_utf8.csvとして配置する(エンコーディングはUTF-8)。3つのカラムがカンマ','で区切られている。

ルーティング

以下の様にルーティング設定する。

コントローラー~処理本体

コード

コントローラーのアクションは以下のとおり。

SplFileObjectインスタンスの生成

PHPのSplFileObjectのインスタンスを、CSVファイルのパスを指定して生成する。

  • LaravelでPHPのクラスを使う場合は、クラス名の冒頭に'\'を記述
  • storage_path()関数によりアプリケーションのstorageディレクトリーを基準にしたCSVファイルのパスを指定

フラグの設定

SplFileObjectクラスのsetFlags()メソッドで、必要なフラグを'|'(or)で連ねて設定する。CSV読み込み時のフラグの影響についてはこちらを参照。

ファイルの読み込み

ファイルの各行をforeachで取り出し、配列に格納していく。

各行はREAD_CSVフラグによりCSVとみなされ、3つのフィールドが分解されて要素数3の配列になる。この結果、$linesには6行分のCSVから読み込んだ配列が格納され、各配列は3つのフィールドに対応する要素を持つ。

ファイルクローズ

ファイルクローズのコマンドはないが、インスタンスの参照変数にnullを代入してインスタンスを破棄している。

PHPマニュアル(SplFileObject)のUser Contributed Notes (64)でSplFileObjectのインスタンスにnullをセットする意義が示されている。

ビューへの引継ぎ

タイトルとCSVから読み込んだ配列をビューに渡している。

ビューにおける表示

ビューでは、コントローラーから受け取った変数をHTMLとして展開している。

以下はブラウザーでの表示例。

ファイルの順次読込

CSVファイルのサイズがかなり大きい可能性がある場合、一括して配列に読み込むとサーバーのメモリーを過大に圧迫することが考えられる。

CSVの内容をデータベースに登録するような処理の場合、1行ずつ読み込んで処理し、サーバーの負荷を軽減することを検討すべき。

エンコーディング

読み込むCSVファイルのエンコーディングがUTF-8以外の場合、そのまま読み込んだだけでは適正に扱えない。このようなことは表計算ソフトで作成したファイルがShift-JISというのはよくある。

SplFileObjectでCSVファイルを読み込む場合、1行のデータが各フィールドに対応した要素を持つ配列となるので、mb_covert_variablesを使う。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です