使用PHP或Javascript将大型Excel/Csv文件拆分为多个文件

9
我有一个包含/将包含数十万条甚至上百万条记录的excel(file.xls)/csv(file.csv)文件。是否可能将其拆分为多个文件?例如将file.xls拆分为file1.xls、file2.xls、file3.xls等等。
是否有任何可以使用的库?PHP能否实现?javascript呢? 我在哪里可以指定每个文件包含多少行?
谢谢。

1
你是在说 xls(BIFF)文件吗?还是 csv 文件?或者是带有 .xls 扩展名的 csv 文件?Excel xls 文件和 CSV 文件是非常不同的... 而且 xls(BIFF)文件仅限于 65535 行,因此除非您的数据分布在多个工作表中,否则不可能拥有数百万条目。 - Mark Baker
有可能编写一个跨平台的代码,可以在CSV或Excel上运行。这真的可能吗? - Kenneth P.
这是可能的,但是当涉及到如此大量的xls数据时,您可能会遇到内存问题和性能缓慢的情况。我的PHPExcel库可以做到这一点,但我建议坚持使用直接的CSV,这样可以轻松地逐行处理。 - Mark Baker
PHPExcel,所以你写了那个库。太好了!现在CSV文件的最大条目数为10万,用于测试。如果你能介绍一下如何做,我可能会进一步研究它。谢谢。 - Kenneth P.
3个回答

30

将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);

1
这段代码可以正常工作,但鉴于提问者的问题是如何拆分大型文件,按照原样的示例将创建500k个文件,每个文件包含2行csv数据。我相信这对他来说不太可接受。我建议将splitSize提高到更合理的水平,至少为10k。 - Ross
有些问题。只有第一行是正确的,其他行都在第一列中带有分号。如何解决?您能否通过将大型CSV文件的第一行(标题)添加到每个拆分文件中来改进它? - tomasr

4

是的,在PHP中使用CSV文件可以实现这一点。您只需迭代大文件并将每个X行分块,将这些行转发到另一个文件即可。

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

然后,您需要将迭代器分成每个X行的部分。可以按照以下概述完成:

只需将输出复制到多个<ul>...</ul> HTML列表中,即可将其复制到新文件中。基本上就像在以下概述中一样工作:

然而这一次你想使用SplFileObject::fputcsv方法。请注意,你需要使用最新稳定版的PHP,否则你需要进行不同的操作,请参见fputcsv()
如果原始文件的第一行包含列标题,你可能也对以下内容感兴趣: 它展示了一些扩展/处理传入文件的方法。你可能不需要那里完成的完整抽象,只需保留第一行即可。

0

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

$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++;

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接