使用PHP合并两个大型CSV文件

时间:2011-01-19 21:26:23

标签: php csv

我想用PHP合并两个大的CSV文件。这个文件太大了,甚至无法一次性存入内存。在伪代码中,我可以想到这样的事情:

for i in file1
  file3.write(file1.line(i) + ',' + file2.line(i))
end

但是当我使用fgetcsv循环浏览文件时,如果不首先将整个内容加载到内存中,我将如何从某个文件中获取行n并不是很清楚。

有什么想法吗?

编辑:我忘了提到两个文件中的每一个都有相同的行数,并且它们具有一对一的关系。也就是说,file1中的第62,324行与file2中的第62,324行相同。

5 个答案:

答案 0 :(得分:4)

不确定您使用的是哪种操作系统,但如果您使用的是Linux,则使用paste命令可能要比在PHP中执行此操作容易得多。

如果这是一个可行的解决方案,并且您不一定需要在PHP中执行此操作,则可以尝试以下操作:

paste -d ',' file1 file2 > combined_file

答案 1 :(得分:3)

查看fgets功能。您可以读取每个文件的一行,处理它们,然后将它们写入新文件,然后转到下一行,直到您到达文件末尾。

PHP: 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()从文件中读取一行。如您所见,此代码同时在两个文件上使用它,将合并的行写入第三个文件。这里的手册:

http://php.net/fgets

http://php.net/fopen

http://php.net/fwrite

答案 3 :(得分:1)

尝试使用fgets()一次从每个文件中读取一行。

答案 4 :(得分:0)

我认为这个解决方案是为每一行开始映射第一行(如果需要,可以使用某种键),然后使用fread和fwrite创建一个新的csv(我们​​现在知道每行的开头和结尾,所以我们只需要寻找和阅读)

另一种方法是将它放入MySQL(如果可能的话)然后再回到新的CSV