ラボ > PHP:ファイル関連

PHPでCSV(or TSV)ファイルの読み込み(SplFileObject())

CSVだったりTSVをサクッと読み込ませたい

作成日:2018-06-19, 更新日:2018-11-09

基本

▼CSVとして読み込ませる(SplFileObject::READ_CSV)

$path = 〇〇〇;
$file = new SplFileObject($path);
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);

$records = array();
foreach ($file as $line) {
  $records[] = $line;
}
var_dump($records);

※個人的に・・・空白行はいらないので「$file->setFlags()」で色々と設定した。空白行が欲しいなら「READ_CSV」だけで良いかも。

$file->setFlags()の中身

SplFileObject::DROP_NEW_LINE 行末の改行を読み飛ばします。
SplFileObject::READ_AHEAD 先読み/巻き戻しで読み出します。
SplFileObject::SKIP_EMPTY ファイルの空行を読み飛ばします。期待通りに動作させるには、READ_AHEAD フラグを有効にしないといけません。
SplFileObject::READ_CSV CSV 列として行を読み込みます。

存在しないファイルの場合

例外処理が走ってくれるのでtry-catch()でくくってあげればOK

$path = 〇〇〇;
try {
  $file = new SplFileObject($path);
  $file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
  
  $records = array();
  foreach ($file as $line) {
    $records[] = $line;
  }
  
  var_dump($records);
}
catch (Exception $e) {
  echo $e->getMessage();
}

TSVの読み込み

$path = 〇〇〇;
$file = new SplFileObject($path);
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
$file->setCsvControl("\t");

$records = array();
foreach ($file as $line) {
  $records[] = $line;
}
var_dump($records);

メモ

「fgetcsv()」を使う方法もあるが遅いそうだ。

$path = 〇〇〇;
$file = new SplFileObject($path);

$records = array();
while (!$file->eof()) {
  $records[] = $file->fgetcsv();
}
var_dump($records);

関連項目

PHP ファイルから各行を取得して何かしたい(SplFileObject())、LimitIterator())
CSVファイルの読込み前に文字コード変換(SplFileObject())

参考

PHP SplFileObject クラス