昔(2006年頃)作ったマクロを改良してみました。
SASファイルがあるディレクトリ内のSASデータセットを一括でExcelファイルへと変換するマクロです。
SASファイルの実行パスを取得する方法がSAS Faqに掲載されていたので参考にしました。
実行パスから自動的に処理するディレクトリを特定してSASデータセットを変換します。
データセットを大量にはき出したとき、SASのViewerで見るのはちょっと・・・・。なら、Excelに変換できたらラクだなと思いましてね。
マクロ本体
filename dlog1 dummy; proc printto log = dlog1 print = dlog1; run; /* get the submitted Path macro */ %let execpath = ' '; %macro setexecpath; %let execpath = %sysfunc(getoption(sysin)); %if %length(&execpath) = 0 %then %let execpath = %sysget(sas_execfilepath); data _null_; count = 0; do i = length("&execpath") to 1 by -1; if substr("&execpath", i, 1) = '\' & count = 0 then do; call symput('Path', substr("&execpath", 1, i)); count = 1; j = i; end; else if substr("&execpath", i, 1) = '\' & count = 1 then do; call symput('Dir', substr("&execpath", i + 1, j - i - 1)); stop; end; else do; call symput('Dir', 'file'); end; end; run; %mend setexecpath; /* export macro */ %macro EXOut( mem = , lib = , ); %if &ftype = csv %then %let filename = "&Path.&mem..csv"; %else %if &otype = 1 %then %let filename = "&Path.&mem..xls"; %else %let filename = "&Path.&Dir..xls"; %let libname = &lib..&mem; proc export data = &libname outfile = &filename %if &ftype = csv %then %do; dbms = csv replace; %end; %else %do; dbms = excel replace; sheet = "&mem"; %end;; run; %mend EXOut; %macro MStart; /* macro variable check */ %if %symexist(ftype) = 0 %then %let ftype = xls; %if %symexist(otype) = 0 %then %let otype = 1; %if %symexist(outfile) = 1 %then %let Dir = &outfile; %if &ftype ^= csv & &ftype ^= xls %then %let ftype = xls; %if &otype ^= 1 & &otype ^= all %then %let otype = 1; /* get library informations */ proc datasets library = CONV; contents data=_all_ nods; ods output Members = Work.Mem; quit; /* get the number of datasets */ %let dsid = %sysfunc(open(Work.Mem)); %let nobs = %sysfunc(attrn(&dsid,NOBS)); %let rc = %sysfunc(close(&dsid)); /* call export macro */ proc sql noprint; select Name into :name1 - :name&nobs from Work.Mem; %do i = 1 %to &nobs; %let toname = &&name&i; %EXOut(mem = &toname, lib = CONV); %end; quit; %mend MStart; %setexecpath; libname CONV "&Path";
実行部分
/* default: xls separate */ %MStart; /* csv (separate) */ %let ftype = csv; %MStart; /* xls separate */ %let ftype = xls; %MStart; /* xls combine */ %let otype = all; %MStart; /* xls combine & filename */ %let otype = all; %let outfile = filename; %MStart;