Php 开始分析第“行”上的CSV文件;X";

Php 开始分析第“行”上的CSV文件;X";,php,loops,csv,Php,Loops,Csv,我正在做一个CSV上传,有35000行的内容正在进行,我正试图想出一种方法来开始解析CSV文件的“X”行。我一直在刷新页面并保存每次最后一行,这样可以解决浏览器超时的问题。现在,我只需要知道如何在我离开的那行上启动我的CSV文件 while(($data = fgetcsv($handle, 0, ",")) !== false) { if($i > 2000) { break; } //start parsing here $i++ } $_SESSION['la

我正在做一个CSV上传,有35000行的内容正在进行,我正试图想出一种方法来开始解析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行。标头将重置并再次启动进程,但由于$\u SESSION['lastline']现在是2001年,因此代码中断(这很好)。我需要弄清楚的是,如何在第2001行开始解析,然后在第4000行再次中断解析。这将持续到所有35000条生产线完工为止

我正在考虑在解析之前将break语句设置为:

if($i < $_SESSION['lastLine']) { $i++; }
if($i > $_SESSION['lastLine'] + 2000) { break; }
if($i<$\u会话['lastLine']){$i++}
如果($i>$_会话['lastLine']+2000){break;}
我的问题是,执行35000行CSV意味着最后10次左右的运行将不得不在解析开始之前执行数千次i++循环。我四处寻找一些方法,只在“X”行启动CSV文件,这将是我的首选方法,但我找不到任何东西。任何帮助都会很棒。

用于在文件中保存您的位置。然后,您可以在重新启动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 ...

您应该将字节偏移量与行号一起保存,然后在开始解析之前将
fseek
保存到该字节偏移量。

因为我发现fseek正在偏移字符,而不是行 我曾经

像这样的

$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);
}
功能链接:-

只需将最后一行索引和缓冲区大小(2000)设置到会话中,并在循环中使用它作为行的最大值,将您的答案标记为少数几个选项中的最佳选项,但不幸的是,我使用了我的选项(它起作用),因为我需要在半小时内快速修复。非常感谢您的回复,当我有时间回到这个客户机时,我会使用您的想法,因为我相信它的效率是我的十倍。对于阅读我的有用解决方案的其他人:1)函数是fgetcsv(不是第一行中显示的fetgetcsv)2)PHP手册警告“对于大于2GB的文件,某些文件系统函数可能会返回意外结果”请看,我认为它不是
fetgetcsv
@MarcB WC,我正在寻找这种类型的解决方案,您能否提供一个代码的工作示例。@MarcB fseek似乎是在偏移字符而不是行号