【问题标题】:Convert large XML file to CSV in PHP在 PHP 中将大型 XML 文件转换为 CSV
【发布时间】:2010-01-24 21:42:48
【问题描述】:

我有一个 50MB 的 XML 文件。我想将其转换为 CSV 文件,但我发现的大多数方法都会耗尽服务器内存。有没有使用 XMLreader 等流方法的好方法。

【问题讨论】:

  • 答案是肯定的。 (请随时发布更多详细信息以获得更详细的答案)
  • 没有太多其他细节 - 我有一个 XML 文件,我想输入 CSV 格式,我有一堆算法可以做到这一点,但它们都占用了太多内存。你有不会耗尽内存的算法吗?
  • 等等,Excel?您在原始帖子中说 XML。如果是 Excel,请执行 File > Save As... > CSV 以获取 CSV 输出。
  • 如果这只是一个文件和一次操作,为什么不谷歌 xml2csvxml to csv 转换器 并使用免费提供的一种那些。无需在 PHP 中执行此操作。
  • 我想用 PHP 来做,因为有多种方法可以配置 CSV 输出。我想将它保存在 PHP 中,以便我可以控制输出。这将成为自动化过程的一部分,因此最好在 PHP 中使用该方法,而不是在某些 Windows GUI 中使用。

标签: php xml csv


【解决方案1】:

您希望使用XmlReader 来解析 XML,因为它可以用作基于事件的解析器 - 例如。它不会将所有内容都加载到内存中,而是随着输入文件的前进而读取。

【讨论】:

    【解决方案2】:

    基于 SAX 风格的 expat 解析器是最节省空间的选项:

    http://php.net/xml_parse

    它会在元素标签打开或关闭时执行您的 $start_element_handler 和 $end_element_handler 回调,而不是将整个文档保存在内存中。

    但是,50 MB 仍然不是很多,也许您的提供商可以达到限制。

    php_value memory_limit 100M
    

    在 .htaccess/httpd.conf 中,或在 php.ini 中设置。

    【讨论】:

    • 文件为 50MB,但进程使用的空间远超过 50MB。内存限制增加了不少,还是不行
    • 用这些回调尝试 xml_parse.. 它会使用很少的 RAM
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      聚会迟到了……

      对于<domains><domain><name>myname.com</name></domain></domains>的xml结构

      $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;
          }
      }
      

      【讨论】:

        【解决方案5】:

        您是否尝试过增加内存限制? ini_set('memory_limit', '256M')

        (顺便说一句,这是一个非常糟糕的解决方案)

        【讨论】:

          【解决方案6】:

          我对 PHP API 了解不多,但似乎这个类可以帮助你:XML Parser

          基本上,您正在寻找基于事件的解析器,例如旧的 SAX。这种解析器类型将触发一个事件或类似的东西。它将节省内存,因为它不需要将整个文档加载到内存中。

          【讨论】:

            【解决方案7】:

            如果 XML 文件相当简单并且可以避免通过成熟的 XML 解析器,而是可以由 PHP 逐行读取并导出每一行,这样可以节省整个文件一下子记忆。什么是 XML 结构?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-19
              • 2017-08-14
              • 2011-06-18
              • 2011-03-05
              • 2015-10-28
              • 2014-11-22
              相关资源
              最近更新 更多