PRXMATCH не работает с функцией PRXPARSE в SAS

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

Входные данные имеют 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;

person Aman    schedule 16.06.2020    source источник
comment
Привет, добро пожаловать в SO!, Задавая здесь вопросы, поделитесь кодом и некоторыми попытками, которые вы предприняли для решения нашей проблемы. А также, если вы предприняли какие-либо попытки исправить это, отредактируйте их в своем вопросе. Ваше здоровье!   -  person TMA    schedule 16.06.2020
comment
Спасибо за полезные советы. @aananddham. Теперь я предоставил все подробности в своем посте. Можете ли вы просмотреть его сейчас?   -  person Aman    schedule 16.06.2020
comment
Не могли бы вы предоставить некоторые примеры входных данных и ожидаемых результатов?   -  person    schedule 16.06.2020
comment
Я могу указать формат идентификатора в столбце комментариев. abc1234567, abd1234, ab12345678, abce123456. Ожидаемый результат должен иметь 2 столбца: Comment_ID и ID (с отношением 1 ко многим).   -  person Aman    schedule 16.06.2020
comment
Аман, я не думаю, что PRXPARSE пересекает границу шага. В этом случае шаг ДАННЫЕ. Согласно документации SAS: последовательные вызовы PRXPARSE не вызывают повторной компиляции, а возвращают идентификатор регулярного выражения для уже скомпилированного регулярного выражения. Следовательно, набор данных work.comments_parsed содержит числовое значение, которое является идентификатором скомпилированного регулярного выражения. Я не думаю, что ваш последующий prxmatch увидит этот скомпилированный код после прохождения границы первого шага данных. Перенесите строку в шаблоне var, а не в идентификаторе prxparse. С удовольствием поправлюсь, если что не так.   -  person AlanC    schedule 16.06.2020
comment
@AlanC Не могли бы вы подсказать, где мне внести изменения? Мне немного непонятны ваши предложения. Поскольку нужно использовать одно регулярное выражение, я использовал continue pasre_id; чтобы сохранить значение идентификатора синтаксического анализа. Я попытался сохранить reg exp в переменной шаблона и попытался передать его в вызове prxnext, однако эта функция вызова принимает только идентификатор, возвращаемый prxparse.   -  person Aman    schedule 16.06.2020


Ответы (1)


Код работает, когда у меня есть синтаксический анализ и 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;
person Aman    schedule 16.06.2020
comment
Как будто так и должно быть. Шаг — это шаг DATA или шаг PROC. Думайте о них как о деталях Lego с входами и выходами: они автономны. Вызов функции на шаге данных не должен влиять на другой шаг данных. В вашем исходном примере, поскольку prxparse является скомпилированной функцией, вы пытались выполнить будущую операцию внутри набора данных, а не результат. Вы никогда ничего не делали с prxparse, поэтому никакой ценности не было. В этом примере вы используете prxparse и используете на одном шаге, поэтому он доступен для функции на том же шаге. Я надеюсь, что это проливает свет. - person AlanC; 16.06.2020