何度も忘れているのでメモします。これでマクロ変数名と値をログに出力できます。DATAステップのPUTと書き方が違うので、ぱっと思い出せない。
%put &=var;
マニュアルで %put のセクションには書かれていない。出典がどこにあるのか探す。
https://go.documentation.sas.com/doc/ja/sasstudiocdc/3.8/pgmsascdc/mcrolref/n189qvy83pmkt6n1bq2mmwtyb4oe.htm
SASプログラムとログを解析するユーティリティを開発するための備忘録です。This is a memo to develop utility that analyzes the SAS log.
何度も忘れているのでメモします。これでマクロ変数名と値をログに出力できます。DATAステップのPUTと書き方が違うので、ぱっと思い出せない。
%put &=var;
マニュアルで %put のセクションには書かれていない。出典がどこにあるのか探す。
https://go.documentation.sas.com/doc/ja/sasstudiocdc/3.8/pgmsascdc/mcrolref/n189qvy83pmkt6n1bq2mmwtyb4oe.htm
/* ソースコードをファイルに出力するマクロ */
%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);
/*
*++
* データセット(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;
/* *++ * データセットの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);