首页 > 解决方案 > 为什么我的 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”,则拆分文件,但我也对如何实现这一点感到迷茫。

标签: phpcsv

解决方案


因为如果 $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++;
}

推荐阅读