Как объяснить этот макрос SAS? - PullRequest
0 голосов
/ 21 марта 2019

Я новый ученик SAS. Вот заявление SAS.

%if %sysfunc(prxmatch(/^(E0349646)$/i, &SYSUSERID.)) ne 0 %then %do;

Я только знаю, что "E0348535" - это идентификатор пользователя, но не могу понять весь этот оператор. Пожалуйста, объясните этот макрос SAS. Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Сначала немного по терминологии. Макропроцессор SAS - это инструмент, который может манипулировать текстом и передавать результат в реальную систему SAS для интерпретации. Эта строка кода использует оператор макропроцессора, но это не полное определение макроса. Фактически, начиная с SAS 9.4 (я думаю, возможно, с техническим выпуском 9.4m4?), Вы могли бы использовать оператор типа %if/%then/%do в обычной программе SAS, даже не определяя действительный макрос вообще.

Итак, у вас есть макрос %if. Общая форма:

%if condition %then statement ;

Поскольку оператор после части %then является оператором макроса %do, вашей программе понадобится оператор %end;, чтобы отметить конец блока для выполнения, когда условие выполнено.

Давайте посмотрим на условие, которое проверяется в вашем %if утверждении.

%sysfunc(prxmatch(/^(E0349646)$/i, &SYSUSERID.)) ne 0 

Таким образом, используется макрос-функция %sysfunc(), позволяющая вызывать функцию SAS prxmatch() в коде макроса. Это часть группы функций, которые реализуют регулярные выражения Perl. Вы также ссылаетесь на макропеременную с именем SYSUSERID. Эта конкретная макропеременная - это та, которую SAS создает автоматически, чтобы содержать ИД пользователя, который запускает программу SAS. Регулярное выражение, используемое в вызове функции prxmatch(), проверяет, равно ли значение E0349646, игнорируя регистр. Результатом будет позиция первого найденного местоположения в искомой строке. Если он не найден, он вернет 0. (SAS, как и люди, использует индексы, начиная с единицы, а не с нуля.).

Обратите внимание, что включение ^ и $ в регулярное выражение означает, что оно должно соответствовать полной строке. Итак, вы проверяете, работает ли E0349646.

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

%if %upcase(&sysuserid)=E0349646 %then %do;
0 голосов
/ 21 марта 2019

prxmatch - это функция регулярного выражения PERL в SAS.Этот оператор проверяет, содержит ли имя пользователя идентификатор E0349646.prxmatch возвращает первую позицию, в которой происходит совпадение.Если совпадение не найдено, оно равно 0.

%sysfunc() - это макрофункция, которая позволяет использовать функции SAS в макросах.Поскольку prxmatch является функцией SAS, используемой в макросе, она должна быть заключена в %sysfunc().

Наконец, ne - это еще один способ сказать not equals.Собрав все воедино, вот что делает это утверждение на простом английском языке:

If the user ID contains 'E0349646', then do some stuff.

...