用ftell解析csv的php

时间:2013-11-02 03:34:53

标签: php csv

我有一个500mb的csv文件,超过500,000行,每行有80个字段。我正在使用fget逐行处理文件。

$col1 = array();
while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
  $col1[] = $row[0];
}

由于托管服务提供商对PHP文件的执行时间限制(120秒),我无法在一次运行中处理整个文件。

我尝试使用ftell()和fseek()来记住重启的最后位置。麻烦的是,有时ftell()位置在一行的中间,而恢复意味着错过了行的前半部分。

是否有一种优雅的方式可以知道最后一行是否已成功处理,并从之后的一行恢复?我意识到我可以做一个简单的计数器,然后再循环到那一点,但是这会在我可以处理到文件末尾的行上产生递减的回报。

有没有类似于ftell()和fseek()的东西可以在我的情况下使用?还是一种限制ftell()返回上一行结尾的指针的方法?

1 个答案:

答案 0 :(得分:2)

当我需要使用大文件时,我总是使用“分而治之”的前提。对于你的情况,我会:

  • 动态创建一个文件夹
  • 将此大文件复制到其中
  • 拆分它(在从php调用的linux拆分中)split command
  • 在php中使用shell_exec命令
  • 拆分后,将其删除(大文件)
  • 然后循环浏览文件夹中逐个读取的文件。
  • 对于我完成的每个文件,我都删除它。因此,如果时间限制发生,您只需继续阅读文件夹中的文件。