PRXMATCH не работает с функцией PRXPARSE в SAS - PullRequest
0 голосов
/ 16 июня 2020

У меня есть комментарии с несколькими идентификаторами, которые мне нужно извлечь из комментариев. Требуется каждый я в отдельном столбце.

Входные данные имеют 2 столбца - comment_id и Comment (он имеет 1 или несколько идентификаторов)

Желаемый результат должен иметь 2 столбца: comment_id и ID

Я использую следующую функцию.

Для синтаксического анализа

data work.comments_parsed;
set work.comments;
if _N_ = 1 then do;
    pasre_id=prxparse("/ab[c|d]?e?\d+/");
end;
retain pasre_id;
start = 1;
stops = length(Comment);
run;

Для генерации вывода

data work.desired_output;
set work.comments_parsed;
length ID $ 500;
call prxnext(pasre_id, start, stops, Comment, pos, len);
do while (pos >0);
    ID = substr(Comment,pos,len);
    output;
    call prxnext(pasre_id, start, stops, Comment, pos, len);
end;
run;

ОШИБКА: аргумент 1 функции PRXNEXT должен быть положительным целым числом, возвращаемым PRXPARSE для допустимого шаблона. ОШИБКА: в функции PRXNEXT обнаружена внутренняя ошибка. Шаг DATA завершается во время фазы EXECUTION.

Я считаю, что ошибка связана с неправильным синтаксическим анализом, однако, когда я использую функцию prxmatch напрямую с использованием регулярного выражения, я получаю правильное соответствие. Не могли бы вы подсказать мне, как я могу заставить этот код работать.

Этот код работает нормально

data pattern_testing;
set work.comments_parsed;
pos = prxmatch("/ab[c|d]?e?\d+?/", Comment);
run;

Но этот код также дает ту же ошибку:

data pattern_testing;
set work.comments_parsed;
pos = prxmatch(pasre_id,Comment);
run;

1 Ответ

0 голосов
/ 16 июня 2020

Код работает, когда у меня есть синтаксический анализ и prxnext на одном и том же шаге данных.

data work.comments_parsed;
set work.comments;

if _N_ = 1 then pasre_id = prxparse("/ab[c|d]?e?\d+/");
retain pasre_id;
length gen_string $ 500;
call prxnext(pasre_id, start, stops, COMMENT, pos, len);
do while (pos >0);
    gen_string = substr(LAST_COMMENT,pos,len);
    output;
    call prxnext(pasre_id, start, stops, LAST_COMMENT, pos, len);
end;
run;
...