我正在开发一个包含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文件,这是我首选的方法,但我找不到任何东西。任何帮助都会很棒。
答案 0 :(得分:1)
使用ftell()
保存您在文件中的位置。然后,您可以在重新启动fgetcsv()循环之前fseek()
到该位置,例如
while($row = fgetcsv($handle)) {
$cur_pos = ftell($handle);
if ($some_condition) {
break;
}
}
.....
fseek($handle, $cur_pos); // jump back to last position
... continue on wards ...
答案 1 :(得分:0)
在开始解析之前,应该将字节偏移量与行号一起保存,然后将fseek
保存到该字节偏移量。
答案 2 :(得分: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);
从该行号
迭代整个CSVwhile(!$file->eof())
{
$row=$file->fgetcsv();
print_r($row);
}