Разделение большого файла каждый раз </byebye> происходит - PullRequest
0 голосов
/ 18 июня 2011

Ниже код разбивает мой файл каждые 10 строк, но я хочу, чтобы он делился каждый раз

</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 (!@fwrite($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')

?>

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 18 июня 2011

Если вы беспокоитесь о размерах, вы можете переключиться на файловый ресурс и использовать 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 голосов
/ 18 июня 2011

Если я вас правильно понимаю, это должно сделать.

$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-файлов.

Sidenote: Вы используете @ слишком много.

...