ラボ > PHP:ファイル関連

PHP ファイルから各行を取得して何かしたい(SplFileObject())、LimitIterator())

何万行とかあるデータをゴニョゴニョしたい。途中で落ちたら・・・次回は途中から実行させたい

作成日:2018-08-23, 更新日:2023-06-01

基本

・万が一、途中で落ちたときは途中の行から開始したい→実行済みの行をどっかに保存しておく

try {
  $path  = ファイルPATH;
  $limit = 500; // 一度に取得する行数
  
  $num   = ~ 開始行:どっかに保存した実行行を取得。無ければ「0」~;
  
  setlocale(LC_ALL, 'English_United States.1252'); // バグ対策
  $file = new SplFileObject($path);
  
  // 1行ずつ読み込む(各行をCSV、TSVで読み込むときはコメント)
  $file->setFlags(SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
  
  // CSVとして読み込む(SplFileObject::READ_CSVが増える)
  //$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
  
  // TSVとして読み込む
  //$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
  //$file->setCsvControl("\t");
  
  while (!$file->eof())  {
    // 開始行に移動:while文から抜けるために必要と思われる・・・
    $file->seek($num);
    
    // 500行ずつ取得して処理実行。
    $lines = new LimitIterator($file, $num, $limit);
    foreach ( $lines as $line ) {
      ~ 処理 ~
    }
    
    // 次の行をセット
    $num += $limit;
    
    ~ $numをどっかに保存 ~
  }
}
catch (Exception $e) {
  echo $e->getMessage();
}

関連項目

PHPでCSV(or TSV)ファイルの読み込み(SplFileObject())
CSVファイルの読込み前に文字コード変換(SplFileObject())