开始在“X”行解析CSV文件

时间:2012-08-10 14:45:17

标签: php loops csv

我正在开发一个包含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文件,这是我首选的方法,但我找不到任何东西。任何帮助都会很棒。

3 个答案:

答案 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);

从该行号

迭代整个CSV
while(!$file->eof())
{
    $row=$file->fgetcsv();
    print_r($row);
}

功能链接: - seekfgetcsv