Макрос фильтра Sas - PullRequest
       17

Макрос фильтра Sas

0 голосов
/ 12 апреля 2020

Здравствуйте, у меня есть макрос, который предназначен для приема только одного значения фильтра, однако я хочу сделать его множественным вводом запятого с кодом значения. Пожалуйста помоги. data new (where name =John, David, Ralph)

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

С вызовами макросов проще использовать что-то кроме запятой в качестве разделителя. Пространство например. Или другой символ, который не будет отображаться в передаваемых значениях, например | или ^, который не имеет особого значения для макропроцессора, как запятая.

Оператору IN в SAS не нужны запятые между значениями, пробелы будут работать.

Для строк вы можете добавить кавычки в макрос.

%macro my_macro(list);
   %local qlist;
   %let qlist="%sysfunc(tranwrd(&list,%str( )," "))";
   proc print data=sashelp.class;
     where name in (&qlist);
   run;
%mend my_macro;
%my_macro(Alfred Alice);

Но для чисел кавычки не нужны, так что проще.

%macro my_macro(agelist);
   proc print data=sashelp.class;
     where age in (&agelist);
   run;
%mend my_macro;
%my_macro(12 13);
0 голосов
/ 13 апреля 2020

Правильная опция where= будет

data new (where=(name in ('John', 'David', 'Ralph'));

Готовы ли вы передать вашему макросу список значений в кавычках?

Как выглядит текущий макрос?

Предположим, что макрос принимает одно значение без кавычек:

%macro my_macro (name);
  data new (where=(name="&name"));
    set sashelp.class;
  run;
%mend;

%my_macro (Alfred)

Измененный макрос, принимая список значений в кавычках, потребует %STR('value-1', ..., 'value-n' ) в вызове макроса для маскировки запятых. Без маскировки каждое значение будет считаться отдельным аргументом.

%macro my_macro (names);
  data new (where=(name in (&names)));
    set sashelp.class;
  run;
%mend;

%my_macro (%str('Alfred', 'Jane'))

Оператор SAS in позволяет разделить список значений через пробел, поэтому этот вызов также будет работать.

%my_macro ('Alfred'  'Jane')

Если вы хотите, чтобы значения имени не заключались в кавычки, когда вы передаете их, вам нужно больше кодировать. Опции PARMBUFF %macro позволят вашему коду обращаться к автоматической c переменной syspbuff, то есть ко всем после имени макроса.

Таким образом, вызов

%my_macro (Alfred, Jane, Authur)

приведет к тому, что syspbuff будет

(Alfred, Jane, Authur)

См. Документацию % MACRO Macro Statement - Пример # 3 это показывает, как %DO l oop и %SCAN() используются для анализа значений из SYSPBUFF

Перед тем как спуститься в эту кроличью нору, спросите себя: "Что если само значение фильтра нужно содержать запятую "? «Простой» контракт ценностей без кавычек внезапно становится головной болью. Вызываемому абоненту необходимо замаскировать запятые с помощью %str

%my_macro (Alfred,William,Wayne%str(,)Bruce,%str(Grayson, Dick))

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

%macro my_macro (names);
  data new (where=(FINDW("&names",trim(name),'|')));
    set sashelp.class;
  run;
%mend;

%my_macro (Alfred|Jane)
...