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.