EXPORTプロシージャを使ってCSVを出力するのも間違いではないが、EXPORTプロシージャ内でも同様のSASプログラムを生成しているので、それに合わせて簡易なプログラムを作ってみた。
サンプルであり、マクロ化はしていないけど、マクロ化も難しい話ではない。
サンプルは、ヘッダー行にラベルを出力する仕様で、細かいながら、デリミタは「,」、DSDオプションでの出力。
options symbolgen ;
options source source2 ;
%let outputfilepath = %sysfunc(sysget(TEMP))\class.csv ;
%let targetdataset = SASHELP.CLASS ;
%let temporarydataset = WORK._WK_DEF ;
%let _wk_sasfile = %sysfunc(pathname(WORK))\temp.sas ;
%let _wk_dlm = ',' ;
proc contents data=&targetdataset. noprint out=&temporarydataset. ;
quit ;
proc sort data=&temporarydataset. ;
by MEMNAME VARNUM ;
quit ;
data &temporarydataset. ;
set &temporarydataset. END=_LAST ;
file %sysfunc(quote(%superq(outputfilepath))) lrecl=32767 dsd dlm=&_wk_dlm. ;
attrib _WK_HEADER length=$300. ;
if not missing(LABEL) then _WK_HEADER = LABEL ;
else _WK_HEADER = NAME ;
put _WK_HEADER @@ ;
run ;
data _null_ ;
set &temporarydataset. ;
file %sysfunc(quote(%superq(_wk_sasfile))) lrecl=1000 ;
attrib _TMP length=$1000. ;
by MEMNAME VARNUM ;
if first.MEMNAME then do ;
_TMP = "data _null_ ;" ;
put _TMP ;
_TMP = catx(" ","set",symget('targetdataset'),";") ;
put +4 _TMP ;
_TMP = catx(" ","file",quote(symget(cats('outputfilepath'))),"mod lrecl=32767 dlm=&_wk_dlm. dsd ;") ;
put +4 _TMP ;
_TMP = "put" ;
put +4_TMP ;
end ;
put +8 NAME ;
if last.MEMNAME then do ;
_TMP = ";" ;
put +4_TMP ;
_TMP = "run ;" ;
put _TMP ;
end ;
run ;
%include %sysfunc(quote(%superq(_wk_sasfile))) ;
proc sql ;
drop table &temporarydataset. ;
quit ;