Split big file everytime </ byebye> si verifica

Sotto il codice divide il mio file each 10 righe, ma voglio che divida each volta

</byebye> 

si verifica. In questo modo, otterrò più file contenenti ciascuno;

 <byebye> *stuff here* </byebye> 

Codice:

 <?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("mdy"); $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') ?> 

Qualche idea?

Se ti capisco bene, questo dovrebbe farlo.

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

Quindi scrivi le parti nei diversi file

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

Ma suppongo (senza conoscere la tua fonte), che questo comporterà un xml non valido . Dovresti usare uno dei XML-Parser (SimpleXML, DOM, ..) per gestire i file xml.

Sidenote: tu usi @ molto troppo.

Se sei preoccupato per le size, puoi passare a una risorsa file e usare fread o fgets per controllare la quantità di memory che stai colpendo.

 $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 arrays onto } } 

Puoi anche risparmiare più memory aprendo il file per l'output e, mentre analizzi, reindirizza il contenuto. Quando incontri una voce chiuderai il file e aprirai il prossimo.