使用PHP

时间:2018-07-05 15:58:30

标签: php

我有一个具有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);
}

1 个答案:

答案 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);
}