Я пытаюсь помочь клиенту, который был недоволен системой EMR (Electronic Medical Records) и хотел переключиться, но компания заявила, что не может извлечь демографические данные пациента из базы данных (мы спросили, могут ли они получить нам имя, адрес, доб в каком-то файле csv, очень простые вещи), но они утверждают, что они не могут этого сделать. (сумасшедший, учитывая, что они используют базу данных sql). В любом случае - то, как они передавали пациентов, находилось в файлах xml, и их было около 40 000+. Но они содержат намного больше, чем демографические данные. После ряда исследований и проделанного обширного программирования на Perl 15 лет назад (я признаю, что с годами он ржавый). Я думал, что это должна быть хорошая задача, чтобы сделать это в Perl, - и я наткнулся на модуль XML :: Twig, который похоже, в состоянии сделать трюк. К сожалению, XML-код, который представляет интерес выглядит следующим образом:XML :: Twig синтаксический анализ тегов с тем же именем
< == надрез ==>
<patient extension="Patient ID Number"> // <--Patient ID is 5 digit number)
<name>
<family>Patient Family name</family>
<given>Patient First/Given name</given>
<given>Patient Middle Initial</given>
</name>
<birthTime value=YEARMMDD"/>
несколько полей для адреса etc.are следующие в файле XML.
< == надрез ==>
Вот что я закодированы:
my $twig=XML::Twig->new(twig_handlers => {
'patient/name/family' => \&get_family_name,
'patient/name/given' => \&get_given_name
});
$twig->parsefile('test.xml');
my @fields;
sub get_family_name {my($twig,$data)[email protected]_;$fields[0]=$data->text;$twig->purge;}
sub get_given_name {my($twig,$data)[email protected]_;$fields[1]=$data->text;$twig->purge;}
У меня никаких проблем не читая всю информацию, которые имеют уникальные метки (семья, город, почтовый индекс, и т.д. .), но XML: Twig возвращает только средний начальный элемент для тега. Как я могу обратиться к первому вступлению «заданного» и присвоить ему $ fields [1] и второе вхождение «заданных» в $ fields [2], например, или вырезать средний начальный.
Также как извлечь «Идентификатор пациента» или значение «BirthTime» с помощью XML :: Twig - я не мог найти ссылку на это. Я пробовал использовать $ data-> findvalue ('BirthTime'), но это оказалось пустым.
Я смотрел: Perl, XML::Twig, how to reading field with the same tag, который был очень полезен, но поскольку повторяющиеся теги находятся в одном и том же пути, они разные, и я не могу найти ответ. XML: Twig возвращает только последнее значение, найденное при поиске совпадения при разборе файла? Есть ли способ извлечь все вхождения значения?
Благодарим вас за помощь!
Привет, спасибо за быстрый ответ, я попробую сегодня. Но на ваш вопрос - у каждого пациента есть свой собственный XML-файл, и у нас есть около 40 000 + из них, которые мне нужно проанализировать. И да, я забыл закрыть пациента в последней строке - немного разобраться в форматировании в поле вопроса - и потом забыл добавить это в конце (так как copy & paste не работает в текстовом поле для кода кажется). – yoeddy
Привет, Бородин, большое вам спасибо за вашу помощь. То, что вы опубликовали, помогло мне лучше понять модуль Twig, и я могу проанализировать нужные мне данные. Нет. Я могу работать над очисткой данных и запускать их через эти файлы. Спасибо! – yoeddy
И, наконец, еще один вопрос - я люблю толкать хэш в глобальный массив - очень аккуратно и чисто. Мой вопрос: если мне придется разбирать 40 000 файлов, это будет проблема? В этом массиве есть 40'000 + хэшей? Может ли perl обрабатывать такие большие массивы - или было бы лучше написать результаты каждого файла, анализируемого прямо в файл csv? Наверное, я спрашиваю, являются ли небольшие файловые операции более ресурсоемкими, чем заполнение массива 40-тысячными хэшами и их запись в конце в файл csv? Спасибо! :) – yoeddy