【问题标题】:Merge two large CSV files with PHP用 PHP 合并两个大的 CSV 文件
【发布时间】:2011-01-19 21:26:23
【问题描述】:

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

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

但是当我使用fgetcsv 循环访问一个文件时,我不清楚如何在不先将整个文件加载到内存中的情况下从某个文件中获取n 行。

有什么想法吗?

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

【问题讨论】:

    标签: php csv


    【解决方案1】:

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

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

    paste -d ',' file1 file2 > combined_file
    

    【讨论】:

    • 是的!惊人的!我喜欢这样的解决方案。我试过了,效果很好。
    【解决方案2】:

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

    PHP: fgets

    具体看PHP手册中标题为Example #1 Reading a file line by line的例子。注意fgets 函数的返回值也很重要。

    返回一个最长为 length - 1 的字符串 从指向的文件中读取的字节数 句柄。如果没有更多数据可 读入文件指针,然后 FALSE 被退回。

    所以,如果它没有返回 FALSE,你就知道你还有更多的行要处理。

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          另一种方法是将其放入 MySQL(如果可能的话),然后返回新的 CSV

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-26
            • 1970-01-01
            • 2012-08-12
            • 2013-04-22
            • 2020-11-22
            • 2020-12-13
            • 1970-01-01
            相关资源
            最近更新 更多