【问题标题】:Split large Excel/Csv file to multiple files on PHP or Javascript在 PHP 或 Javascript 上将大型 Excel/Csv 文件拆分为多个文件
【发布时间】:2013-05-19 21:56:57
【问题描述】:

我有包含/将包含数十万个条目的 excel(file.xls)/csv(file.csv) 文件,我猜甚至是数百万个。是否可以将这个文件拆分为多个文件?比如file.xls到file1.xls、file2.xls、file3.xls等等。

有没有库可以使用?这可能在 PHP 上吗?或者javascript怎么样? 在哪里可以指定每个文件包含多少行?

谢谢

【问题讨论】:

  • 您说的是 xls (BIFF) 文件吗?或关于 csv 文件?还是扩展名为 .xls 的 csv 文件? Excel xls 文件和 CSV 文件两者非常不同......并且 xls (BIFF) 文件限制为 65535 行,因此除非您的数据被拆分到多个工作表中,否则不可能有数百万个条目
  • 两者。可能适用于 csv 或 excel 的交叉兼容性代码。这甚至可能吗?
  • 这是可能的,但是在 xls 中讨论如此大量的数据时,您可能会遇到内存问题和性能下降。我的 PHPExcel 库可以做到这一点,但我建议坚持使用直接 CSV,它可以轻松地一次处理一行
  • PHPExcel,所以你确实写了那个库。优秀!目前 CSV 的最大条目数是 100,000 个测试。如果您介绍如何做到这一点,也许我会潜伏在它周围?谢谢

标签: php excel csv


【解决方案1】:

是的,可以在 PHP 和 CSV 文件中执行此操作。您基本上遍历大文件并分块每 X 行,将这些行转发到另一个文件。

您可以在此答案中找到如何将大型 CSV 文件作为迭代器打开的信息:

然后你需要对迭代器的每个 X 行部分进行分块。这可以在这里完成:

您无需输出到多个<ul>...</ul> HTML 列表,而是复制到一个新文件中。这基本上像中概述的那样工作:

但是这次你想使用SplFileObject::fputcsv method。请注意使用最新的稳定 PHP,否则您需要做不同的事情,请参阅fputcsv()

如果原始文件的第一行包含列标题,您可能会对以下内容感兴趣:

它只是展示了一些扩展/处理传入文件的方法。您可能不需要在那里完成完整的抽象,只保留第一行可能已经完成了。

【讨论】:

    【解决方案2】:

    将 CSV 文件拆分为多个 CSV 文件的快速而肮脏的方法

    $inputFile = 'input.csv';
    $outputFile = 'output';
    
    $splitSize = 10000;
    
    $in = fopen($inputFile, 'r');
    
    $rowCount = 0;
    $fileCount = 1;
    while (!feof($in)) {
        if (($rowCount % $splitSize) == 0) {
            if ($rowCount > 0) {
                fclose($out);
            }
            $out = fopen($outputFile . $fileCount++ . '.csv', 'w');
        }
        $data = fgetcsv($in);
        if ($data)
            fputcsv($out, $data);
        $rowCount++;
    }
    
    fclose($out);
    

    【讨论】:

    • Mark - 这很好用,但考虑到 OP 关于拆分大文件的问题,所写的示例将创建 500k 个文件,每个文件包含 2 行 csv 数据。我敢肯定这对他来说是不可接受的。我建议将上面的 splitSize 提高到更合理的值 - 至少说 10k。
    • 有些地方是错误的。只是第一行是正确的,其他行在第一列用分号。它是如何解决的?您可以通过在每个拆分文件中添加第一行大 CSV(标题)来改进它吗?
    【解决方案3】:

    我认为你也可以使用“按文件大小分割”:

    $part = 1;
    
    $maxSize = 50;//50 Mb
    
    $fopen = fopen('filename.csv','r') or die ('ERROR');
    
    while (($line = fgetcsv($fopen, 10000, ";")) !== FALSE) {
    
        $ftowrite = fopen("Part_$part.csv",'a');
    
        fputcsv($ftowrite,$line);
    
        clearstatcache();
    
        $size = filesize ( "review_p$part.csv" ) / 1000000;
    
        if ($size  > $maxSize) {
    
            fclose($ftowrite);
    
            $part++;
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 2022-01-16
      • 2017-01-27
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多