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