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”,则拆分文件,但我也对如何实现这一点感到迷茫。
解决方案
因为如果 $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++;
}
推荐阅读
- d3.js - 我可以在 d3.js 轴中定义最大刻度数吗?
- python - 在 Python 中手动输入中位数作为 K-means 的质心
- django - 如何在 Django 模型中返回数组字段?
- javascript - 在嵌入 HTML 的 Shiny 应用程序中包含 AmChart
- javascript - 如何将状态元素推送到状态数组?
- jquery - 如何在 laravel ajax 中更改针对 id 的状态?
- android - Gradle 构建失败 ....Failed to create component for 'dialog' 原因:java.awt.HeadlessException
- sql - Case When 语句的意外结果
- javascript - 如何在 setInterval(function(){...}) 中传递服务器发送事件对象
- javascript - Javascript。使用回调、承诺、异步/等待、生成器将同步函数转换为异步