2014-12-12 2 views
0

В SAS я обычно использую несколько вложенных команд для синтаксического анализа строк данных XML в отдельные переменные.parse xml string in sas

например, если бы я пытался извлечь значение для «оценки» из строки XML, я бы использовал следующий код.

var1 = put(compress(scan(substr(value,find(value,'<score>'),40),2,"><")),10.); 

Код выше работает для извлечения первого вхождения в строку XML, но когда я встречаю этот тип строки данных

<score>25</score><score>72</score><score>43</score> 

ограничения моего кода стало ясно. Я могу только извлечь первую итерацию из своего набора данных, и я не уверен, как извлечь вторую и третью итерацию этого параметра. Как я могу изменить свой код, чтобы сообщить SAS взять данные после второй и третьей итерации моего параметра «оценка»?

Приведенные выше данные не полностью отражают то, с чем я работаю. Мои собственные данные могут содержать до 40-80 символов между итерациями параметра.

+0

Вы пробовали инструмент XML Mapper SAS? Он включен в Base SAS. – Reeza

ответ

0

Разбор XML в SAS имеет множество потенциальных маршрутов, в зависимости от конкретной структуры XML-файла, желаемых результатов и ваших возможностей.

Если вы можете создать XML-карту и использовать механизм XML-имени в качестве первого параметра. Это очень мощный и очень полезный. Если у вас нет утилиты XML Mapper (свободно распространяемой с большинством установок SAS, но если ваш_записчик не устанавливает ее, то вы не можете ее скачать); ссылка, например, для 9.2, равна here; ваша конкретная версия будет иметь тот же вид страницы и ссылки. Или попросите представителя технической поддержки SAS.

Если по какой-либо причине это невозможно, вы также можете создать свою собственную XML-карту; для этого есть инструкции в Интернете. Он использует XSL, который очень эффективен для сопоставления столбцов с наборами данных без необходимости искать вещи вручную.

Если это не сработает, то разбор текста возможен несколькими способами.

Во-первых, ваш метод выше, вероятно, самый медленный, но работает (используя FIND). Некоторые улучшения включают использование SCAN и маркировку "<>" в качестве разделителей.

Во-вторых, вы можете использовать @"<score>" с именем input; это очень мощный и позволяет вам действовать так, как если бы <score> был вашим разделителем строк/полей. Вы также в более поздних версиях SAS можете использовать опцию DLMSTR= в имени файла и буквально использовать ее в качестве разделителя.

В-третьих, вы можете использовать регулярные выражения. PRXMATCH и связанные с ними помогут здесь, так как некоторые из них способны итеративно искать (найти совпадение 1, затем сопоставить 2, затем ...). Они не идеальны, но в ограниченных ситуациях они отлично работают. Однако их немного сложно изучить, и я, конечно, не собираюсь делать учебник здесь.

Я думаю, что в вашем вышеприведенном случае метод ввода прост; см., например, следующее.

data test; 
    input @"<score>" score 2. @@; 
datalines; 
<score>25</score><score>72</score><score>43</score> 
;;;; 
run; 

Очевидно, что у вас могут быть проблемы, но это работает, по крайней мере, в этом конкретном примере.