为什么我的csv拆分脚本在标头之前返回多余的行?

时间:2019-01-16 15:37:02

标签: php csv

我有一个定期下载的csv文件。 CSV预计会被拆分,因此将其拆分为5000个大块,包括每个拆分的csv顶部的标头。

这意味着我的标题行位于1、5001、10002、15003、20004等...

我已经编写了一个php脚本来完成文件的拆分,但是我似乎无法捕获仅在标头中包含标头的模式。

<?php 
$inputFile = 'import.csv';
$outputFile = 'output_';

$splitSize = 5000;

$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);
    var_dump($data);
    fputcsv($out, $data);
    $rowCount++;

}
}

fclose($out);

这里的问题是,在第三个文件中,我在每个文件的顶部都有一行额外的数据,这些数据应该已经打印到前一个文件中。

这会让我相信我需要将块的大小改为5001行,但是如果我提供5001作为splitsize参数,则会得到相反的结果。第一个文件在第1行和5001处包含标题。

我很想在检测到标头的任何地方拆分文件,因此,如果$ data [0]等于'Action',则拆分文件,但是我也很迷于如何完成该操作。

1 个答案:

答案 0 :(得分:0)

由于如果$ data [0] =='Action',您可能希望拆分,所以我建议:

while (!feof($in)) {
    $data = fgetcsv($in);

    if ($data[0] == 'Action') {
        if ($rowCount > 0) {
            fclose($out);
        }
        $out = fopen($outputFile . $fileCount++ . '.csv', 'w');
    }

    fputcsv($out, $data);
    $rowCount++;
}