The Nameless City

何故か製薬やSAS関連のブログ、の予定。

EXPORTプロシージャを使わないCSVの出力方法。

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 ;