- /* ソースコードをファイルに出力するマクロ */
- %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);
SASプログラムとログを解析するユーティリティを開発するための備忘録です。This is a memo to develop utility that analyzes the SAS log.
2018年5月2日水曜日
カタログに含まれているソースコードを1ずつ取り出してファイルに保存
カタログの中に含まれているソースコードを、1つずつ取り出してディレクトリに出力するマクロです。Model ManagerのAPIの中身を見るために、書きました。
登録:
コメントの投稿
(
Atom
)
白状すると私はCALL EXECUTEルーチンを敬遠していました。
返信削除理由は良くわからないのですが、使いどころ勘所が分からなかったのだと思います。マクロでループを組むときに、ローカル変数に値と件数を保持してから繰り返しの処理を行っていました。%let imax=5; %do i=1 %to &imax; .... のような書き方です。
2、3時間して読み替えすと、引数が見えにくい。