2

我必须逐行读取 10 到 20 兆的 CSV 文件。file()没用,我必须找到最快的方法。

我试过 with fgets(),它运行良好,但我不知道每次调用它时它是否读取一个小块,或者它是否缓存一个更大的块并优化文件 I/O。我必须尝试这种fread()方式,自己解析EOL吗?

4

4 回答 4

7

如果可能的话,你应该使用fgetcsv()

否则,总是有 fgets()。

于 2008-11-05T13:23:16.543 回答
2

对于大文件,stream_get_line 显然比 fgets 更有效。如果您为读取指定一个合理的最大长度,我看不出 PHP 必须“提前读取”才能读取一行的任何理由,正如您似乎担心的那样。

如果您想使用 CSV,那么 fgetcsv 将以更合理的格式返回结果。

于 2008-11-05T15:10:59.493 回答
1

fgets()应该完全可以满足您的需求。甚至file()应该没问题 - 20mb 不是很大,除非你同时这样做很多次。

不要忘记您可以fgets()使用它的第二个参数进行调整。

于 2008-11-05T13:21:27.280 回答
0

您应该看一下fgetcsv(),它会自动将逗号分隔线解析为数组。

至于运行时效率,我不知道。您必须进行快速测试,最好使用您希望稍后处理的大小的文件。但是如果 fget 我会感到惊讶???和fput???功能未经过 I/O 优化。

于 2008-11-05T13:28:03.897 回答