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())