2011-02-18 166 views
1

我很努力地创建一个PHP脚本,以帮助根据行数将大文本文件分割成多个较小的文件。我需要增加分割的选项,所以它从第一个文件中的10行开始,第二行中的20行开始,依此类推。PHP脚本将大文本文件分割为多个文件

+1

到目前为止你有什么?您当前的代码呈现的确切问题是什么?这听起来有点像一个奇怪的问题,可能实际上是一个任务或考试问题。 – Treffynnon 2011-02-18 10:29:47

回答

4

这里是我的脚本一个功能:

<?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 ([email protected]($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); 
} 
?> 
0

嗯。你不需要包含文件的最后部分? 我想更换 “如果($ I> = $线){” 用 “如果($ I> = $线|| FEOF($处理)){”

0
$handle = fopen('source/file/path','r'); 
     $f = 1; //new file number 
     while(!feof($handle)) 
     { 
      $newfile = fopen('new/file/path'.$f.'.txt','w'); //create new file to write to with file number 
      for($i = 1; $i <= 5000; $i++) //for 5000 lines 
      { 
       $import = fgets($handle); 
       //print_r($import); 
       fwrite($newfile,$import); 
       if(feof($handle)) 
       {break;} //If file ends, break loop 
      } 
      fclose($newfile); 

      $f++; //Increment newfile number 
     } 
     fclose($handle); 
3

它应该是一个评论,但我还不能评论。 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 ([email protected]($fhandle, $buffer)) { 
     echo "Cannot write to file ($fname)"; 
     exit; 
    } 
    fclose($fhandle); 
    $buffer = ''; 
} 
?> 

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

相关问题