我有一个具有5000行的文件,我想将其拆分为多个文件,每个文件约200行。第一个文件包含标题行,并且该行也需要放置这些单独的文件。
运行后,我有25个文件(fileofrows_1.csv ... fileofrows_25.csv),但第一个文件包含402行。为什么?
这是我使用的代码:
<?php
$filecount = 1;
$rowcount = 0;
$headerrow = '';
$filename = 'fileofrows';
$newfilename = $filename . "_" . $filecount . ".csv";
$splitvalue = 200;
$initheader = true;
if ($file = fopen($filename . ".csv", "r")) {
while(!feof($file)) {
$line = fgets($file);
if($initheader){
// Write header row to file
$headerrow = $line;
file_put_contents ( $newfilename, trim($headerrow) . PHP_EOL, FILE_APPEND);
$initheader = false;
}else{
// Write content row to file
file_put_contents ( $newfilename , trim($line) . PHP_EOL, FILE_APPEND);
$rowcount++;
}
if($rowcount === $splitvalue){
// Switch file
$newfilename = $filename . "_" . $filecount . ".csv";
// Write header row to new file
file_put_contents ( $newfilename, trim($headerrow) . PHP_EOL, FILE_APPEND);
$filecount++;
$rowcount = 0;
}
}
fclose($file);
}
答案 0 :(得分:2)
您要先分配$newfilename
,然后再递增$filecount
。
if($rowcount === $splitvalue){
// Increment counter before setting new name
$filecount++;
// Switch file
$newfilename = $filename . "_" . $filecount . ".csv";
// Write header row to new file
file_put_contents ( $newfilename, trim($headerrow) . PHP_EOL, FILE_APPEND);
$rowcount = 0;
}
您应该尝试减少代码重复,因为这会使代码更难阅读。我已经对您的代码进行了少量重构。
$fileCount = 1;
$rowCount = 0;
$headerRow = '';
$fileName = 'fileofrows';
$newFileName = null;
$splitValue = 200;
$initHeader = true;
function setFileName($num) {
$newFileName = $filename . "_" . $fileCount . ".csv";
}
function writeLine($row) {
file_put_contents ($newFileName, trim($row) . PHP_EOL, FILE_APPEND);
}
function writeHeader() {
writeLine($headerRow);
$initHeader = false;
}
function writeRow($row) {
writeLine($row);
$rowCount++;
}
if ($file = fopen($fileName . ".csv", "r")) {
setFileName();
while(!feof($file)) {
$line = fgets($file);
if($initHeader){
$headerRow = $line;
writeHeader($file);
}else{
writeRow($line);
}
if($rowCount === $splitValue){
$fileCount++;
setFileName();
writeHeader()
$fileCount++;
$rowCount = 0;
}
}
fclose($file);
}