Конвертировать большой XML-файл в CSV в PHP - PullRequest
3 голосов
/ 25 января 2010

У меня есть 50 МБ XML-файл. Я хочу преобразовать его в файл CSV, но большинство методов, которые я нашел, исчерпывают память сервера. Есть ли хороший способ сделать это с помощью потокового метода, такого как XMLreader.

Ответы [ 7 ]

4 голосов
/ 25 января 2010

Вы хотели бы использовать XmlReader для анализа XML, так как он работает как анализатор на основе событий - например, он не загружает все в память, а читает по мере продвижения по входному файлу.

4 голосов
/ 25 января 2010

синтаксический анализатор в стиле SAX является наиболее экономичным вариантом:

http://php.net/xml_parse

он будет выполнять обратные вызовы $ start_element_handler и $ end_element_handler при каждом открытии тега элементаили закрыт, вместо того, чтобы хранить весь документ в памяти.

, но все равно 50 МБ это не много, возможно, ваш провайдер может увеличить лимит.

php_value memory_limit 100M

в .htaccess / httpd.conf или установите его в php.ini.

2 голосов
/ 20 мая 2010

Я написал этот алгоритм некоторое время назад .. Не стесняйтесь попробовать.

http://sites.google.com/site/soichih/q-a/xml-to-csv-converter

1 голос
/ 10 апреля 2011

Поздно на вечеринку ...

для структуры xml <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;
    }
}
0 голосов
/ 25 января 2010

Если файл XML довольно прост и не позволяет проходить через полноценный синтаксический анализатор XML, а вместо этого может быть прочитан построчно PHP и экспортировать каждую строку по мере необходимости, это сохранит весь файл в память сразу. Что такое структура XML?

0 голосов
/ 25 января 2010

Я не очень разбираюсь в PHP API, но, кажется, этот класс может вам помочь: Анализатор XML

По сути, вы ищете парсер, основанный на событиях, например старый SAX. Этот тип парсера будет запускать событие или что-то подобное. Это будет эффективно использовать память, поскольку не нужно загружать весь ваш документ в память.

0 голосов
/ 25 января 2010

Вы пытались увеличить лимит памяти? ini_set('memory_limit', '256M')

(кстати, это очень плохое решение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...