0

35,000行の処理が行われているCSVアップロードに取り組んでおり、CSVファイルの解析を「X」行から開始する方法を考えています。ページを更新し、毎回最後の行を保存して、ブラウザで発生していたタイムアウトの問題を修正しました。ここで、中断した行からCSVファイルを開始する方法を知る必要があります。

while(($data = fgetcsv($handle, 0, ",")) !== false) {
    if($i > 2000) { break; }
    //start parsing here
    $i++
}
$_SESSION['lastLine'] = $i;
$_SESSION['filepath'] = $filepath;
//resend headers

ファイルパスは一時フォルダーにアップロードされており、再度アクセスできるため、セッションとしても保存します。ですから、初めてアップロードするときは、2000行すべてを完全に満足しています。ヘッダーがリセットされ、プロセスが再開されますが、$ _ SESSION ['lastline']が2001になっているため、コードが壊れています(これは問題ありません)。私が理解する必要があるのは、2001行目で解析を開始し、4000行目で再びブレークする方法です。これは、35,000行すべてが完了するまで続きます。

構文解析の前にbreakステートメントを設定して次のように言うことを考えていました。

if($i < $_SESSION['lastLine']) { $i++; }
if($i > $_SESSION['lastLine'] + 2000) { break; }

私の問題は、35,000行のCSVを実行すると、解析が開始される前に、最後の10回程度の実行でi++ループを数千回実行する必要があることを意味します。「X」行からCSVファイルを開始する方法をいくつか探しましたが、これは私の好みの方法ですが、何も見つかりませんでした。どんな助けでも素晴らしいでしょう。

4

3 に答える 3

1

ftell()ファイル内の位置を保存するために使用します。fseek()その後、fgetcsv()ループを再開する前に、その位置に移動できます。

while($row = fgetcsv($handle)) {
    $cur_pos = ftell($handle);
    if ($some_condition) {
          break;
    }
}
.....

fseek($handle, $cur_pos); // jump back to last position
... continue on wards ...
于 2012-08-10T14:48:52.013 に答える
0

fseek解析を開始する前に、バイトオフセットを行番号と一緒に保存してから、そのバイトオフセットに保存する必要があります。

于 2012-08-10T14:49:07.817 に答える
0

fseekが文字をオフセットしていることがわかったので、行の代わりにSplFileObjectを使用しました

このようなもの

$file = new SplFileObject('your-csv-file.csv');
//this is zero based so need to subtract 1
$file->seek(2); /// Going to line 3
$arr=$file->fgetcsv();
print_r($arr);

その行番号からCSV全体を繰り返すには

while(!$file->eof())
{
    $row=$file->fgetcsv();
    print_r($row);
}

関数リンク: -seekfgetcsv

于 2017-08-22T04:28:00.767 に答える