我有一个50MB的XML文件。我想将其转换为CSV文件,但我发现大多数方法耗尽了服务器内存。是否有一种使用流方法(如XMLreader)执行此操作的好方法。
答案 0 :(得分:4)
SAX风格的基于expat的解析器是最节省空间的选项:
只要打开或关闭元素标记,它就会执行$ start_element_handler和$ end_element_handler回调,而不是将整个文档保存在内存中。
但是,50 MB不是很多,也许你的提供商可以达到极限。
php_value memory_limit 100M
在.htaccess / httpd.conf中,或在php.ini中设置。
答案 1 :(得分:4)
您希望使用XmlReader
来解析XML,因为它可以作为基于事件的解析器 - 例如。它不会将所有内容加载到内存中,而是在输入文件前进时读取。
答案 2 :(得分:2)
我前段时间写过这个算法。请随意给它一个镜头。
http://sites.google.com/site/soichih/q-a/xml-to-csv-converter
答案 3 :(得分:1)
晚会......
表示<domains><domain><name>myname.com</name></domain></domains>
$url = "http://mysite.com/my.xml";
$returnData = file_get_contents($url);
$xml = simplexml_load_file($url);
$csv = 'my.csv';
$path = '/var/www/html/';
$domain = $xml->domains->domain;
$fullpath = $path.$csv;
$fp = fopen($fullpath, 'w');
foreach ($xml->domains->domain as $domain) {
fputcsv($fp, get_object_vars($domain),',','"');
}
fclose($fp);
header('Content-Description: File Transfer');
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename='.basename($csv));
header('Content-Transfer-Encoding: binary');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($fullpath));
readfile($fullpath);
exit;
}
}
答案 4 :(得分:0)
您是否尝试过增加内存限制? ini_set('memory_limit', '256M')
(这是一个非常糟糕的解决方案)
答案 5 :(得分:0)
我对PHP API了解不多,但是这个类似乎可以帮助你:XML Parser
基本上你正在寻找一个基于事件的解析器,比如旧的SAX。此解析器类型将触发事件或类似的事件。它将节省内存,因为它不需要将整个文档加载到内存中。
答案 6 :(得分:0)
如果XML文件相当简单并且可以避免通过完整的XML解析器,而是可以通过PHP逐行读取并导出每一行,那将节省整个文件记忆一下子。什么是XML结构?