Xpoint
   [напомнить пароль]

Замена в большом XML файле

Метки: [без меток]
2008-08-25 19:18:56 [обр] GRAy(0/259)[досье]

Задача одноразовая и состоит в следующем:

  1. Есть таблица соответствий "старое имя"-"новое имя" (в базе данных, но это не принципиально). Строк порядка 11000.
  2. Есть относительно большой (~70 мб) xml-файл.

В фале надо каждое встреченное "старое имя" заменить на "новое имя" в соответствии с таблицей из п.1 ;)
Концептуально возможно два пути решения этой задачи:

  1. Итерироваться по списку соответствий и искать/заменять их в файле при помощи либо регулярок, либо манипулированием dom.
  2. Итерироваться по элементам dom документа и на каждый элемент содержащий "старое имя" искать в списке "новое имя" и заменять.

Первый мне кажется неэффективным потому что на каждую запись в таблице надо будет сделать полный проход по документу регуляркой.
Второй лучше, но он требует полного распарсивания документа. Впрочем, если в первом варианте замену производить через dom, этого тоже не избежать.

Вопрос общий - каким инструментом всё-таки лучше решать такую задачу?
Вопрос поконкретней - можно ли где-нибудь сделать примерно следующее (псевдокод):

  file.replace(/ID="([^"]*)"/,map($1))

Где функция map будет вызывана для каждого встреченного подвыражения ([^"]*) и тем, что она вернёт, будет заменена найденая строка.

спустя 5 часов [обр] hogart(0/5)[досье]
А почему не с помощью XSLT? Вроде бы Saxon вполне осиливает такие большие файлы, если я не ошибаюсь.
спустя 6 часов [обр] Dennis F. Latypoff aka funky_dennis(0/78)[досье]
вот этонет?
спустя 2 часа 38 минут [обр] Роман Чемисов(16/327)[досье]

GRAy[досье]
Похожая тема на PerlMonks updating big XML files.

P. S. По-моему, в наше время 70Мб на большой никак не тянет :-)

спустя 31 минуту [обр] GRAy(0/259)[досье]
hogart[досье] В XSLT трудно передать 11k подстановок ;) или надо писать extension функцию... для одноразовой задачи как-то уж очень наворочено. Но я подумаю ;)
Dennis F. Latypoff aka funky_dennis[досье] И да, и нет ;) Во-первых Perl я не знаю, а раздел выбрал т.к. других "Регулярных выражений" на форуме нет ;). Во-вторых, насколько я понял, этот модуль работает примерно как sed, и главный, с моей точки зрения, недостаток (может быть я просто недоразобрался) - невозможность передать подстроку полученную из подгруппы регулярного выражения в функцию, которая на основании этого значения выдаст результат.
Роман Чемисов[досье] Ну я же написал "относительно большой" ;)
спустя 1 час 40 минут [обр] Алексей Севрюков(45/1280)[досье]
GRAy[досье] Заносим 11000 замен в хэш, далее используем вариант b.
P.S. Какой смысл заморачиваться и искать оптимальные решения для одноразовой задачи.
спустя 1 час 6 минут [обр] GRAy(0/259)[досье]
Алексей Севрюков[досье] Ну если "заморачиваться и искать" = "спросить на форуме авось кто знает" ;) думаю не такой и великий труд. А так, кроме перфекционизма, особых причин нет.
Powered by POEM™ Engine Copyright © 2002-2005