DS, имеющие несколько переменных в определенной библиотеке, добавляют их

#sas #sas-macro

#sas #sas-макрос

Вопрос:

 %macro chk(lib=,varlist=);
proc sql noprint;
  select distinct catx(".",libname,memname) into : datalist separated by " "
    from dictionary.columns
     where libname = %upcase("amp;lib") and %upcase(amp;varlist) = upcase("amp;varlist");
quit;

data test1;
set amp;datalist;
run;
proc print data=work.test1;run;
%mend;
%chk(lib=ssp,varlist=name ID height);
  

мой приведенный выше пример выполняет поиск определенных переменных в параметре varlist во всех наборах данных в конкретной библиотеке grp и добавляет их. у меня есть 2 DS со всеми переменными, но выбраны только значения из 1 DS, а не frm DS 2 amp; также выдает ошибку. amp;символьная ссылка datalist не найдена….

Комментарии:

1. Ваш код не выполняет то, что вы заявляете, что он делает, т. Е. Добавляет таблицы или выбирает переменные, равные «ВОЗРАСТУ». Пожалуйста, найдите время, чтобы правильно сформулировать свои вопросы.

2. Нет, это не так, если вы скопируете свой код в SAS, он не будет работать как есть. Для начала ВОЗРАСТ должен быть в кавычках. Не уверен, в чем дело с TEMP. Несмотря на это, я опубликовал ответ на ваш предыдущий вопрос.

3. Вы видели мой комментарий по вашему другому вопросу? Посмотрите на оператор IN support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default /… или используйте ИЛИ. Если a = 1 или a = 2 …

Ответ №1:

Прежде чем создавать макрос, обратите внимание, как должен выглядеть ваш код без макроса.

В этом случае это было бы

 Name in ("Name", "Age", "Sex");
  

Пока вы передаете свой параметр с кавычками и запятой, это будет то, что вы ищете.

Редактировать:

 %macro chk(lib=,varlist=);
proc sql noprint;
  select distinct catx(".",libname,memname) into : datalist      separated by " "
    from dictionary.columns
     where %upcase(libname) = %upcase("amp;lib") and %upcase(name) in (amp;varlist);
quit;

 ***rest of code;
%mend;
  

Вам нужно сначала передать допустимую строку в свой макрос или обработать ее в макросе. Вы не указали, определяете ли вы список вручную или извлекаете его откуда-то. Вам также потребуется замаскировать список, если вы включаете запятые. В принципе, вам нужно найти способ преобразовать строку ‘name age sex’ в ‘NAME’, ‘AGE’, ‘SEX’ или просто передать ее в макрос в этой форме.

 %chk(lib=grp,varlist=%str('NAME', 'AGE', 'SEX'));
  

Комментарии:

1. Я не понимаю вашего комментария. В чем проблема с этим ответом?