我有一个定期下载的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',则拆分文件,但是我也很迷于如何完成该操作。
答案 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++;
}