2011-06-18 17 views
0

下面的代碼分裂我的文件每隔10行,但我想它分裂每次拆分大文件每次</byebye>發生

</byebye> 

發生。這樣,我會得到多個文件,每個文件都包含;

<byebye> 
*stuff here* 
</byebye> 

代碼:

<?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='files/', $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.".xml"; 
     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); 
} 

split_file('testxml.xml') 

?> 

任何想法?

+1

使用simplexml_load_string()來處理xml – Ibu

+0

到目前爲止您嘗試了什麼? –

+0

您有可能發佈更大的XML樣本,或者您是否確認要將每個BYEBYE元素的內容保存到單獨的XML文件中? –

回答

0

如果我理解你是對的,這應該做到這一點。

$content = file_get_contents($source); 
$parts = explode('</byebye>', $content); 
$parts = array_map('trim', $parts); 

然後只寫零部件到不同的文件

$dateString = date('m-d-y'); 
foreach ($parts as $index => $part) { 
    file_put_contents("{$targetpath}part_{$dateString}{$index}.xml", $part); 
} 

但我認爲(不知道你的源),這將導致無效 XML。您應該使用XML-Parser(SimpleXML,DOM,..)之一來處理xml文件。

旁註:您使用@太多太多。

+0

不會「爆炸」會導致很多內存使用情況?無效的XML不是問題,它將被解析爲 - 如果它是html。無論如何,我會放棄它,謝謝。 – natli

+0

取決於文件大小,只要您沒有遇到內存問題,您應該使用_simplest_解決方案。看來,你想從命令行運行它。有記憶通常不是那麼大的事情。 – KingCrunch

+0

那麼你的方法似乎在我的17兆字節文件上工作正常。你認爲我會開始在512MB-RAM服務器上遇到1GB文件的問題嗎?爲了將來的參考,就是。感謝您的快速回答! – natli

0

如果您擔心大小,可以切換到文件資源並使用fread或fgets來控制您正在訪問的內存量。

$f = fopen($source, "r"); 
$out = ''; 

while (!feof($f)) 
{ 
    $line .= fgets($f); 

    $arr = explode('</byebye>', $line); 
    $out .= $arr[0]; 

    if (count($arr) == 1) 
     continue; 
    else 
    { 
     // file_put_contents here 
     // will need to handle lines with multiple </byebye> entries here, 
     // outputting as necessary 

     // replace $out with the final entry of the $arr array onto 
    } 

} 

您也可以通過打開文件進行輸出保存更多的內存,併爲你解析,管的內容吧。當你遇到一個條目時,你可以關閉文件並打開下一個文件。

+0

感謝鮑勃,當我開始打大文件時,這應該會派上用場。 – natli