PHP脚本将大文本文件拆分为多个文件

use*_*897 1 php

我正在努力创建一个 PHP 脚本,以帮助根据行数将大文本文件拆分为多个较小的文件。我需要增加分割的选项,所以它从第一个文件的 10 行开始,第二个文件的 20 行等等。

小智 5

这是我的脚本中的一个函数:

<?php
/**
 *
 * Split large files into smaller ones
 * @param string $source Source file
 * @param string $targetpath Target directory for saving files
 * @param int $lines Number of lines to split
 * @return void
 */
function split_file($source, $targetpath='./logs/', $lines=10){
    $i=0;
    $j=1;
    $date = date("m-d-y");
    $buffer='';

    $handle = @fopen ($source, "r");
    while (!feof ($handle)) {
        $buffer .= @fgets($handle, 4096);
        $i++;
        if ($i >= $lines) {
            $fname = $targetpath.".part_".$date.$j.".log";
            if (!$fhandle = @fopen($fname, 'w')) {
                echo "Cannot open file ($fname)";
                exit;
            }

            if (!@fwrite($fhandle, $buffer)) {
                echo "Cannot write to file ($fname)";
                exit;
            }
            fclose($fhandle);
            $j++;
            $buffer='';
            $i=0;
            $line+=10; // add 10 to $lines after each iteration. Modify this line as required
        }
    }
    fclose ($handle);
}
?>
Run Code Online (Sandbox Code Playgroud)


ElC*_*bra 5

它应该是一个评论,但我还不能评论。AndyDeGroo 的答案是错误的。它不会写入文件的最后几行,或者低于 10 行时不会保存文件。文件还应该在 while() 循环之后保存以写入文件的其余部分。固定功能应该如下所示:

<?php
/**
 *
 * Split large files into smaller ones
 * @param string $source Source file
 * @param string $targetpath Target directory for saving files
 * @param int $lines Number of lines to split
 * @return void
 */
function split_file($source, $targetpath='./logs/', $lines=10){
    $i=0;
    $j=1;
    $date = date("m-d-y");
    $buffer='';

    $handle = @fopen ($source, "r");
    while (!feof ($handle)) {
        $buffer .= @fgets($handle, 4096);
        $i++;
        if ($i >= $lines) {
            $fname = $targetpath.".part_".$date.$j.".log";
            saveToFile($buffer, $fname);
            $j++;
            $i=0;
        }
    }
    $fname = $targetpath.".part_".$date.$j.".log";
    saveToFile($buffer, $fname);
    fclose ($handle);
}

function saveToFile(&$buffer, $fname)
{
    if (!$fhandle = @fopen($fname, 'w')) {
        echo "Cannot open file ($fname)";
        exit;
    }
    if (!@fwrite($fhandle, $buffer)) {
        echo "Cannot write to file ($fname)";
        exit;
    }
    fclose($fhandle);
    $buffer = '';
}
?>
Run Code Online (Sandbox Code Playgroud)

附言。我删除了“$line”变量,因为它没有在任何地方使用。