ラベル マクロ の投稿を表示しています。 すべての投稿を表示
ラベル マクロ の投稿を表示しています。 すべての投稿を表示

2024年2月14日水曜日

マクロ変数の名前と値をログに出力する。

 何度も忘れているのでメモします。これでマクロ変数名と値をログに出力できます。DATAステップのPUTと書き方が違うので、ぱっと思い出せない。

%put &=var;

マニュアルで %put のセクションには書かれていない。出典がどこにあるのか探す。
https://go.documentation.sas.com/doc/ja/sasstudiocdc/3.8/pgmsascdc/mcrolref/n189qvy83pmkt6n1bq2mmwtyb4oe.htm


2022年5月9日月曜日

SAS マクロ変数 /READONLY

2015年の新機能ですが、見落としていました。
マクロ変数の値を READONLY にして定数化できるのね。

https://support.sas.com/resources/papers/proceedings15/SAS1575-2015.pdf

2018年5月2日水曜日

カタログに含まれているソースコードを1ずつ取り出してファイルに保存

カタログの中に含まれているソースコードを、1つずつ取り出してディレクトリに出力するマクロです。Model ManagerのAPIの中身を見るために、書きました。

/* ソースコードをファイルに出力するマクロ */
%macro _myfile(catalog=, memname=, dir=);
 data _null_;
  infile "&catalog..&memname..source" catalog;
  file "&dir./&memname..sas";
  input;
  put _infile_;
 run;
%mend;

/* カタログに含まれているソースコードをディレクトリに出力するマクロ */
%macro extract_source(in=, dir=);
 %local out memname;

 data;
  stop;
 run;

 %let out=&SYSLAST;
 %let memname=%substr(&out, 6); 

 proc catalog catalog=∈
    contents out=&out;
 run;

 data _null_;
  set &out(keep=name type);
  where type eq 'SOURCE';
  attrib catalog length=$32;
  attrib dir length=$128;
  catalog = "&in";
  dir = "&dir";
  call execute('%_myfile(catalog='||catalog||", memname="||name||", dir="||dir||")");
 run;

 proc datasets lib=work nolist;
  delete &memname;
 quit;
%mend;

%extract_source(in=sashelp.modelmgr, dir=/var/tmp);

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;


マクロ %nobs

データステップを使わないで、OBS数を得るマクロです。よく使う割りに忘れます。

/*
*++
* データセットのOBS数を返す
*--
*/

%macro nobs(ds);
 %local dsid rc;
 %let dsid=%sysfunc(open(&ds));
 %if &dsid %then %do;
  %sysfunc(attrn(&dsid,NOBS));
  %let rc=%sysfunc(close(&dsid));
 %end;
 %else %do;
  -1
 %end;
%mend nobs;

%put nobs=%nobs(sashelp.class);