Несколько значений для параметра макроса sas - PullRequest
0 голосов
/ 21 декабря 2018

Я новичок в программировании макросов SAS, и мне нужно включить следующий макрос, чтобы иметь возможность обрабатывать и обрабатывать несколько значений для его параметров макроса. Здравствуйте,

data have;
input name $ ACCOUNT_ID $ cust_id;
cards;
ARTHUR CC1234 1234
TOM eil1235 1235
MIKEZ tb1236 1236
MATT mb1237 1237
LIZ TB1238 1238
PIZ VB1239 1239
TAN MB1240 1240
PANDA . 1241
;
run;

%MACRO algo (IN_DS=,VAR_LIST=,DATA_TYPE_LIST=,OUT_DS=);
DATA &OUT_DS;
SET &IN_DS;

%If &data_type_LIST = num %then 
&var_LIST=sum(&VAR_LIST,2);
%else &var_LIST=cats(&var_LIST,'re');;
run;
%mend;

%algo(IN_DS=HAVE,VAR_LIST=CUST_ID,DATA_TYPE_LIST=num,OUT_DS=out1);`

Теперь мне нужно включить этот макросчтобы иметь возможность передавать несколько значений для параметров макроса.Примерно так:

%algo(IN_DS=HAVE,VAR_LIST='CUST_ID,ACCT_ID',DATA_TYPE_LIST='num,char',OUT_DS=out1); Может кто-нибудь помочь мне включить эту функцию в коде макроса.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Аргумент параметра должен заключаться в кавычки макроса с% STR () в вызове макроса.

Попробуйте

%algo 
( IN_DS=HAVE
, VAR_LIST= %STR (CUST_ID, ACCT_ID)
, DATA_TYPE_LIST=num
, OUT_DS=out1
);

Кавычка макроса отличается от кавычки шага DATA, используемой для символьных литералов.

0 голосов
/ 21 декабря 2018

Убедитесь, что макрос может обрабатывать несколько значений.В общем случае при вызове макроса не рекомендуется использовать запятую в качестве разделителя в списке значений.

Обычно пробел является лучшим разделителем, так как тогда вы можете использовать значение макроса непосредственно в сгенерированном коде.Например, если все ваши переменные имеют одинаковый тип, вы можете просто использовать шаг данных ARRAY.

%MACRO algo (IN_DS=,VAR_LIST=,DATA_TYPE_LIST=,OUT_DS=);
DATA &OUT_DS;
  SET &IN_DS;
  array list &var_list ;
  do _n_=1 to dim(list);
%if &data_type_LIST = num %then %do ;
    list(_n_)=sum(list(_n_),2);
%end;
%else %do;
    list(_n_)=cats(list(_n_),'re');
%end;
  end;
run;
%mend algo;

Если ваши переменные НЕ имеют одинаковый тип, то вам нужно сгенерировать отдельный оператор для каждой переменной.В этом случае вы можете использовать другой разделитель, если хотите, например, символ конвейера, который легче использовать в качестве разделителя при вызовах макро-функций, таких как %scan().

%MACRO algo (IN_DS=,VAR_LIST=,DATA_TYPE_LIST=,OUT_DS=);
%local i var;
DATA &OUT_DS;
  SET &IN_DS;
  %do i=1 %to %sysfunc(countw(&var_list,|));
    %let var=%scan(&var_list,&i,|);
    %if %scan(&data_type_LIST,&i,|) = num %then %do ;
  &var=sum(&var,2);
    %end;
    %else %do;
  &var=cats(&var,'re');
    %end;
  %end;
run;
%mend algo;
%algo(IN_DS=HAVE,VAR_LIST=CUST_ID|ACCT_ID,DATA_TYPE_LIST=num|char,OUT_DS=out1);
0 голосов
/ 21 декабря 2018

Если вы хотите передать список переменных, а затем использовать этот список в коде, который вы опубликовали выше, я бы предложил обработать & var_list как список и использовать scan для определения количества переменных, а затем выполнить циклчерез список и выполнить код соответственно.

...