2014年3月1日土曜日

マクロ %varlist

変数の値をカンマでつないだリストを作りマクロ変数にセットします。よく使う割りに忘れます。変数が数値でも文字型でも動くように修正しました。

/*
*++
* データセット(dsn)の変数(keep)をリストにして、マクロ変数(macvar)にセット
*--
*/
%macro varlist(dsn=, keep=, macvar=);
 %global &macvar;
 %local i dsid n type rc;
 %let i=;
 %let dsid=%sysfunc(open(&dsn,i));
 %let n=%sysfunc(varnum(&dsid,&keep));
 %let type=%sysfunc(vartype(&dsid,&n));
 %let rc=%sysfunc(close(&dsid));
 %let &macvar=;

 %if &type=C %then
  %do;
   /* 変数が文字型 */
   data _null_;
    set &dsn(keep=&keep) end=eod;
    length list $1024;
    retain list;

    if _n_ eq 1 then
     do;
      list = '"' || compress(&keep) || '"';
     end;
    else
     do;
      list = trim(list) || ',"' || compress(&keep) || '"';
     end;

    if eod eq 1 then
     do;
      call symput("&macvar", compress(list));
     end;
   run;

  %end;
 %else
  %do;
   /* 変数が数値型 */
   data _null_;
    set &dsn(keep=&keep) end=eod;
    length list $1024;
    retain list;

    if _n_ eq 1 then
     do;
      list = put(&keep, best.);
     end;
    else
     do;
      list = trim(list) || ',' || put(&keep, best.);
     end;

    if eod eq 1 then
     do;
      call symput("&macvar", compress(list));
     end;
   run;

  %end;
%mend;

%varlist(dsn=sashelp.class, keep=name, macvar=test);
%put test=&test;


0 件のコメント :

コメントを投稿