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

在PHP或Javascript上将大型Excel/Csv文件拆分为多个文件,php,excel,csv,Php,Excel,Csv,我有excel(file.xls)/csv(file.csv)文件,其中包含/将包含数十万条条目,我想可能是数百万条。是否可以将此文件拆分为多个文件?像file.xls到file1.xls、file2.xls、file3.xls等等 有图书馆可供使用吗?这在PHP上可能吗?或者javascript呢? 在何处可以指定每个文件中包含多少行 谢谢是的,在PHP和CSV文件中可以做到这一点。您基本上是在大文件上迭代,并将每个X行分块,将这些行转发到另一个文件 您可以在以下答案中找到如何以迭代器形式打开

我有excel(file.xls)/csv(file.csv)文件,其中包含/将包含数十万条条目,我想可能是数百万条。是否可以将此文件拆分为多个文件?像file.xls到file1.xls、file2.xls、file3.xls等等

有图书馆可供使用吗?这在PHP上可能吗?或者javascript呢? 在何处可以指定每个文件中包含多少行


谢谢

是的,在PHP和CSV文件中可以做到这一点。您基本上是在大文件上迭代,并将每个X行分块,将这些行转发到另一个文件

您可以在以下答案中找到如何以迭代器形式打开大型CSV文件的信息:

然后,需要将迭代器的每个X行分块。这可以按照这里的大纲进行:

只需将其复制到新文件中,而不是输出到多个
    ..
HTML列表中。其基本工作原理如中所述:

但是,这次您希望使用。注意使用最新的稳定PHP,否则需要做不同的操作,请参阅

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


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

将一个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);
我认为您也可以使用“按文件大小拆分”:


你说的是xls(BIFF)文件吗?或者关于csv文件?还是扩展名为.xls的csv文件?Excel xls文件和CSV文件两个非常不同。。。而且xls(BIFF)文件的行数限制为65535行,因此,除非您的数据被拆分到多个工作表中,否则不可能同时拥有数百万个条目。可能是一个可以在csv或excel上使用的交叉兼容代码。这是可能的吗?这是可能的,但在xls中谈论如此大的数据量时,可能会出现内存问题和性能降低。我的PHPExcel库可以做到这一点,但我建议坚持使用纯CSV,它可以很容易地一次处理一行PHPExcel,所以您编写了该库。杰出的目前,测试的CSV最大条目数为100000。如果你介绍怎么做的话,也许我会躲在那里?thanksMark-这很好,但是考虑到OP关于拆分大文件的问题,编写的示例将创建500k个文件,每个文件包含2行csv数据。我相信这对他来说是不合适的。我建议将splitSize提高到更合理的水平,比如至少10k。
$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++;

    }
}