我想用PHP合并两个大的CSV文件。这个文件太大了,甚至无法一次性存入内存。在伪代码中,我可以想到这样的事情:
for i in file1
file3.write(file1.line(i) + ',' + file2.line(i))
end
但是当我使用fgetcsv
循环浏览文件时,如果不首先将整个内容加载到内存中,我将如何从某个文件中获取行n
并不是很清楚。
有什么想法吗?
编辑:我忘了提到两个文件中的每一个都有相同的行数,并且它们具有一对一的关系。也就是说,file1中的第62,324行与file2中的第62,324行相同。
答案 0 :(得分:4)
不确定您使用的是哪种操作系统,但如果您使用的是Linux,则使用paste
命令可能要比在PHP中执行此操作容易得多。
如果这是一个可行的解决方案,并且您不一定需要在PHP中执行此操作,则可以尝试以下操作:
paste -d ',' file1 file2 > combined_file
答案 1 :(得分:3)
查看fgets
功能。您可以读取每个文件的一行,处理它们,然后将它们写入新文件,然后转到下一行,直到您到达文件末尾。
具体看一下PHP手册中标题为示例#1逐行读取文件的示例。注意fgets
函数的返回值也很重要。
返回最多 length 的字符串 - 1 从指向的文件读取的字节数 处理。如果没有更多数据 读入文件指针,然后 FALSE 归还。
所以,如果它没有返回 FALSE ,你知道你还有更多的线要处理。
答案 2 :(得分:3)
您可以使用fgets()
。
$file1 = fopen('file1.txt', 'r');
$file2 = fopen('file2.txt', 'r');
$merged = fopen('merged.txt', 'w');
while (
($line1 = fgets($file1)) !== false
&& ($line2 = fgets($file2)) !== false) {
fwrite($merged, $line1 . ',' . $line2);
}
fgets()
从文件中读取一行。如您所见,此代码同时在两个文件上使用它,将合并的行写入第三个文件。这里的手册:
答案 3 :(得分:1)
尝试使用fgets()一次从每个文件中读取一行。
答案 4 :(得分:0)
我认为这个解决方案是为每一行开始映射第一行(如果需要,可以使用某种键),然后使用fread和fwrite创建一个新的csv(我们现在知道每行的开头和结尾,所以我们只需要寻找和阅读)
另一种方法是将它放入MySQL(如果可能的话)然后再回到新的CSV