【发布时间】:2016-09-26 08:46:39
【问题描述】:
我有一个大的 CSV 文件。由于内存问题(使用 MySQL),如果可能的话,我想一次只读取其中的一部分。
CSV 可能并不重要。重要的是它需要用新的线切割。
示例内容:
Some CSV content
that will break
on a line break
这可能是我的路径:
$path = 'path/to/my.csv';
在我看来,它的解决方案可能如下所示:
$csv_content1 = read_csv_file($path, 0, 100);
$csv_content2 = read_csv_file($path, 101, 200);
- 它读取第 0-100 行的原始内容。
- 它读取第 101-200 行的原始内容。
信息
- 无需解析(只需拆分为内容)。
- 该文件存在于我自己的服务器上。
- 不要将整个文件读入内存。
- 我希望能够在另一个时间进行第二次读取,而不是在同一次运行中。如果需要,我接受保存临时值,如指针。
我一直在尝试阅读其他主题,但没有找到与此问题完全匹配的内容。
也许其中一些可能会起作用?
- SplFileObject
- fgetcsv
也许我在使用$csv_content1 之前不能使用$csv_content2,因为我需要保存某种指针?这种情况下就好了。反正我会按顺序看的。
【问题讨论】:
-
看来需要增加
memory_limit? -
解决方案通常是为您的
read_csv_file()函数编写一些代码来满足您的需求,而不是简单地在 SO 上发布您的要求规范并希望有人会为您做这件事跨度> -
@Noman 我的文件大小未知。它可以是 10MB 或 1TB。可能不是,但这是我想要计算的范围。
-
@JensTörnell 没错,它不能。该文档没有提到任何关于各种偏移的内容。
-
没有什么魔法可以从文件中间开始,除非你知道文件中确切的字节位置开始......如果你知道,那么你可以使用@987654328 @;否则你将不得不一次读一行,边走边算,并丢弃你不想得到的行