У меня есть список SAS. Этот список SAS хранится в макропеременной. Предположим, что у меня нет таблицы для получения этого списка SAS.
Список SAS содержит имена, разделенные запятыми. Пример макропеременной списка SAS:
%LET sas_list = name1,name2,name3;
Я хочу проверить, присутствует ли в списке макропеременная item.
Что-то вроде:
%IF &item. IN &sas_list. %THEN %DO;
Whatever;
%END;
По какой-то причине я получаю сообщение об ошибке:
“A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: name1 IN name1,name2,name3”
Помощь приветствуется.
Добавьте системные параметры minoperator
и mindelimiter
. Они обозначают Macro IN Operator и Macro IN Delimiter.
options minoperator mindelimiter=',';
%LET sas_list = name1,name2,name3;
%LET item = name1;
%IF &item. IN &sas_list. %THEN %DO;
%put &item is in &sas_list;
%END;
Выход:
name1 is in name1,name2,name3
Если вы хотите найти значения, которых нет в списке, пропустите его через %eval
.
options minoperator mindelimiter=',';
%LET sas_list = name1 name2 name3;
%LET item = name4;
%IF %eval(&item. IN &sas_list.) = 0 %THEN %DO;
%put &item NOT in &sas_list;
%END;
Выход:
name4 is NOT in name1,name2,name3
Обратите внимание, что вы также можете указать эти параметры непосредственно в макросе, если хотите, чтобы in
работал только выборочно. Например:
%macro foo / minoperator mindelimiter=',';
...
%mend;
Здесь вам нужно использовать два варианта:
%let sas_list = name1,name2,name3;
options minoperator mindelimiter=',';
%Macro want(item);
%if &item. in &sas_list. %then %put i = 1;
%else %put i = 0;
%mend;
%want(name1);
i = 1
Вы также можете использовать функцию FINDW
, чтобы убедиться в наличии элемента в списке.
%if %sysfunc(FINDW(%upcase(%superq(saslist)), %upcase(&item), %str(,))) %then %do;
...
%end;
Поддержка
%LET sas_list = name1,name2,name3;
таким образом вы можете узнать, есть ли name2
в списке.
data test;
it = findw("&sas_list", 'name2',',');
run;
но я предполагаю, что вы хотите узнать это, не используя шаг data
, поэтому
%let het = %sysfunc(findw(%quote(&sas_list),name2,%quote(,)));
%put NOTE: het is &het;
делает работу. Примечание
%sysfunc()
вызвать ее в операторе макроса%quote()
. В противном случае они будут считаться разделителями аргументов.
Вы можете оценить состояние NOT, заключив в скобки операцию IN.
%IF NOT (&item. IN &sas_list.) %THEN %DO; ...