2011-06-18 7 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

xmlで使用するsimplexml_load_string()を使用 – 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-fileを処理するには、XML-Parser(SimpleXML、DOM、..)のいずれかを使用する必要があります。

サイドノート:@をあまりに多く使用します。

+0

メモリを大量に使用しても "爆発"しないでしょうか?無効なXMLは問題ではありません.HTMLであれば解析されます。とにかく、私はそれを行く、ありがとう。 – natli

+0

ファイルサイズによって異なりますが、メモリの問題が発生しない限り、_simplest_ソリューションを使用する必要があります。コマンドラインから実行したいと思うようです。通常、そのような大きなことではない記憶があります。 – KingCrunch

+0

あなたの方法は、私の17メガバイトのファイルで正常に動作しているようです。 512MB-RAMサーバーの1GBファイルで問題が発生すると思いますか?将来の参照のために、それはです。あなたの素早い答えをありがとう! – natli

0

サイズが気になる場合は、ファイルリソースに切り替えて、freadやfgetsを使用して、ヒットしているメモリ量を制御できます。

また、出力用にファイルを開いて、解析する際に内容をパイプすることで、さらに多くのメモリを節約できます。エントリに出会ったら、ファイルを閉じて次のファイルを開きます。

+0

ありがとうBob、これは私が大きなファイルを打つのを開始すると便利です。 – natli

関連する問題