0

我正在处理一个包含 35,000 行内容的 CSV 上传文件,我正在尝试想办法在“X”行开始解析 CSV 文件。我一直在刷新页面并保存我最后一次使用的行,这样它就可以解决我在浏览器中遇到的超时问题。现在,我只需要知道如何在我离开的那一行开始我的 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);
}

函数链接:- seek , fgetcsv

于 2017-08-22T04:28:00.767 回答