PHP – SplFileObject::setFrags()

概要

PHPのSplFileObjectのフラグがわかりにくかったので整理した。確認したバージョンは以下の通り。

  • OS: Vagrant/VirtualBox/CentOS7
  • PHP: 7.3.28
  • Laravel: 6.20.29

フラグ詳細

\SplFileObject::READ_CSV

行読込の際、CSV列として解釈する。
\SplFileObject::READ_AHEAD
日本語・英語のどのサイトでもマニュアル記述そのままに”先読み/巻き戻しで読み込む”としか書いていない。SKIP_EMPTYなどの処理のためにバッファリングして、処理が行われた場合に巻き戻すという意味か。
\SplFileObject::SKIP_EMPTY
空行が無視される。改行コードのみの行は空行とは認識されず削除対象とならないが、DROP_NEW_LINEと組み合わせることで空行がスキップされる。
\SplFileObject::DROP_NEW_LINE
改行文字が無視される。ダブルクォートで囲んだ項目中に改行文字がある場合も、改行文字が削除される。たとえば以下の様にフィールドの途中に改行を入れたり、空行がある場合、DROP_NEW_LINEにより宮城県と仙台市の間の改行が除かれ、”宮城県仙台市”とつなげられる

テキストファイル読み込み時

概要

以下のようにテキストファイルを扱いたい場合。

  • 改行コードは取り除きたい
  • 空行は読み飛ばしたい

このような場合、SplFileObjectのインスタンスに対して以下のようにフラグ設定する。

改行コードは取り除きたいが空行は空行のままで残したい場合はDROP_NEW_LINEのみ設定し、READ_AHEADはあってもなくてもよい。ただし最後の行の次に空行が付いてきてしまう。

テスト用ファイル

以下のテキストファイルで確認した。エンコーディングはUTF-8で最後の行や空行も含めて各行末のコードはLF

テスト用コード

  • コントローラーでファイルを読み込み、行単位で配列に格納
  • dd()で配列の内容を確認(returnは実行されない)
  • setFlags()の引数を変化させて結果を比較

結果

フラグ設定なしの場合

setFlags()の行をコメントアウトし、フラグ設定なしで実行した場合。

  • 改行コードが残る
  • 最終行の後に空文字列("")が付いてくる

SKIP_EMPTYのみを設定した場合

  • 改行コードが残る
  • 最終行の後にbooleanfalseが付いてくる

DROP_NEW_LINEのみを設定した場合

  • 改行コードは取り除かれる
  • 改行のみの空行は空文字列になる
  • 最終行の後に空文字列が付いてくる

SKIP_EMPTY | DROP_NEW_LINE

  • 改行コードは取り除かれる
  • 空行は取り除かれる
  • 最終行の後にbooleanfalseが付いてくる

READ_AHEAD | SKIP_EMPTY

  • 改行コードは残る
  • 空行は残る
  • 最終行の後には何も付かない

READ_AHEAD | DROP_NEW_LINE

  • 改行コードは取り除かれる
  • 改行のみの空行は空文字列になる
  • 最終行の後に空文字列が付けられる

READ_AHEAD | SKIP_EMPTY | DROP_NEW_LINE

  • 改行コードは取り除かれる
  • 改行のみの空行は取り除かれる
  • 最終行の後には何も付かない

CSVファイル読み込み時

概要

以下のようにCSVファイルを読み込みたい場合。

  • 空行はスキップしたい
  • フィールド中の改行は取り除きたい

このような場合、SplFileObjectのインスタンスに対して以下のようにフラグ設定する。

空行はスキップするがフィールド中の改行は残したい場合、フラグの設定だけでそのような結果を得ることはできないようである。

READ_CSVのみ設定し、内容がnullのデータを登録せずに飛ばしていくことになる。

テスト用ファイル

テスト用コード

結果

READ_CSVのみの場合

  • 空行に対応してnullの要素が残る
  • フィールド中の改行は残る
  • 最終データの後にnullの要素が付く

SKIP_EMPTYを追加

  • 空行に対応してnullの要素が残る
  • フィールド中の改行は残る
  • 最終データの後にfalseの要素が付く

DROP_NEW_LINEを追加

  • 空行に対応してnullの要素が残る
  • フィールド中の改行は取り除かれる
  • 最終データの後にnullの要素が付く

SKIP_EMPTY | DROP_NEW_LINEを追加

  • 空行は取り除かれる
  • フィールド中の改行は取り除かれる
  • 最終データの後にfalseの要素が付く

READ_AHEAD | SKIP_EMPTYを追加

  • 空行に対応してnullの要素が残る
  • フィールド中の改行は残る
  • 最終データの後には何も付かない

READ_AHEAD | DROP_NEW_LINEを追加

  • 空行に対応してnullの要素が残る
  • フィールド中の改行は取り除かれる
  • 最終データの後にnullの要素が付く

READ_AHEAD | SKIP_EMPTY | DROP_NEW_LINEを追加

  • 空行は取り除かれる
  • フィールド中の改行は取り除かれる
  • 最終データの後には何も付かない

 

 

コメントを残す

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