PHP:TSVの読込
古いPHP環境で作成されたシステムで、TSVのファイルを読み込まなければならなくなりました。
PHPでTSVを読み込む方法を検索すると、SplFileObjectを使うと楽そうだとわかりました。
PHP: SplFileObject - Manual
TSVを読み込んでみる
試してみると、簡単に読み込むことができました。
<?php $uploadFilePath = 'upload_file.tsv'; $file = new SplFileObject($uploadFilePath , 'r'); $file->setFlags(SplFileObject::READ_CSV) $file->setCsvControl("\t"); foreach ($file as $row) { var_dump($row); }
空行を読み飛ばしたい
読み込めたのはいいのですが、試していたら空行もそのまま読み込まれてしまいます。
PHPのマニュアルを見ると、定数に
const integer SKIP_EMPTY = 4 ;
があり、
SplFileObject::SKIP_EMPTY ファイルの空行を読み飛ばします。期待通りに動作させるには、READ_AHEAD フラグを有効にしないといけません。
と説明がありました。
検索してみると、以下のページが見つかったので設定してみました。
How to remove the extra line when using PHP SplFileObject and READ_CSV flag? - Stack Overflow
空行が読み飛ばせない
<?php $uploadFilePath = 'upload_file.tsv'; $file = new SplFileObject($uploadFilePath , 'r'); $file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY | SplFileObject::READ_AHEAD); $file->setCsvControl("\t"); foreach ($file as $row) { var_dump($row); }
試した結果、正しく設定しているつもりですが、なぜか空行相変わらず読み込まれ、
array(1) {
[0] =>
NULL
}
と表示されます。
古い環境のためか判断できませんでしたが、
<?php $uploadFilePath = 'upload_file.tsv'; $file = new SplFileObject($uploadFilePath , 'r'); $file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY | SplFileObject::READ_AHEAD); $file->setCsvControl("\t"); foreach ($file as $row) { if (count($row) <= 1) { continue; } var_dump($row); }
判定を追加して空行を読み飛ばすようにしました。
読み込むまでが簡単なので、CSV/TSVを扱う場合は積極的に利用していきます。