ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

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

f:id:AJYA:20181129124344p:plain
unsplash-logoArif Riyanto

空行が読み飛ばせない

<?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を扱う場合は積極的に利用していきます。