下面的代码每隔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')
?>
有什么想法吗?
答案 0 :(得分: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文件。
旁注:你使用@
太多了。
答案 1 :(得分: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
}
}
您还可以通过打开输出文件来节省更多内存,并在解析时将内容传递给它。当您遇到一个条目时,您将关闭该文件并打开下一个文件。