9

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

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

谢谢

4

3 回答 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);
于 2013-05-24T10:41:22.430 回答
4

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

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

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

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

不过这次你要使用的SplFileObject::fputcsv方法。请注意您为此使用最新的稳定 PHP,否则您需要做不同的事情,请参阅fputcsv().

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

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

于 2013-05-24T10:33:16.127 回答
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++;

    }
}
于 2019-05-17T12:05:22.717 回答