2011-02-18 164 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」變量,因爲它沒有在任何地方使用。

相關問題