78%local outloc delim i varlist var vcnt vat dsv vcom vmiss fmttype vfmt;
80%
if not %sysfunc(exist(&ds)) %then %
do;
81 %put %str(WARN)ING: &ds does not exist;
85%
if %index(&ds,.)=0 %then %let ds=WORK.&ds;
87%
if &outencoding=0 %then %let outencoding=;
88%
else %let outencoding=encoding=&outencoding;
90%
if &outref=0 %then %let outloc=&outfile;
91%
else %let outloc=&outref;
93%
if &headerformat=SASJS %then %
do;
96 %mcf_getfmttype(wrap=YES)
98%
else %
if &dlm=COMMA %then %let delim=
",";
105 file &outloc &outencoding lrecl=32767 termstr=&termstr;
106 length header $ 2000 varnm vfmt $32 dlm $1 fmttype $8;
107 call missing(of _all_);
108 dsid=open(
"&ds.",
"i");
109 num=attrn(dsid,
"nvars");
112 varnm=upcase(varname(dsid,i));
113 if i=num then dlm=
'';
114 %
if &headerformat=NAME %then %
do;
115 header=cats(varnm,dlm);
117 %
else %
if &headerformat=LABEL %then %
do;
118 header = cats(coalescec(varlabel(dsid,i),varnm),dlm);
120 %
else %
if &headerformat=SASJS %then %
do;
122 if vartype(dsid,i)=
'C' then header=cats(varnm,
':$char',vlen,
'.');
124 vfmt=coalescec(varfmt(dsid,i),
'0');
125 fmttype=mcf_getfmttype(vfmt);
126 if fmttype=
'DATE' then header=cats(varnm,
':date9.');
127 else if fmttype=
'DATETIME' then header=cats(varnm,
':E8601DT26.6');
128 else if fmttype=
'TIME' then header=cats(varnm,
':TIME12.');
135 else if vlen<8 then header=cats(varnm,
':best',vlen,
'.');
136 else header=cats(varnm,
':best.');
140 %put &sysmacroname: Invalid headerformat value (&headerformat);
148%let varlist=%mf_getvarlist(&ds);
149%let vcnt=%sysfunc(countw(&varlist));
161 %let var=%scan(&varlist,&i);
163 %
if %mf_getvartype(&ds,&var)=C %then %
do;
164 %let dsv1=%mf_getuniquename(prefix=csvcol1_);
165 %let dsv2=%mf_getuniquename(prefix=csvcol2_);
167 &dsv2=length(&var)+countc(&var,
'"');
168 if &dsv2>&dsv1 then &dsv1=&dsv2;
169 if last then call symputx(
172 ,cats(
'$quote',min(&dsv1+2,32767),
'.')
180%let vmiss=%mf_getuniquename(prefix=csvcol3_);
184 file &outloc mod dlm=&delim dsd &outencoding lrecl=32767 termstr=&termstr;
185 if _n_=1 then &vmiss=
' ';
187 %let var=%scan(&varlist,&i);
188 %
if &i=&vcnt %then %
do;
192 %
if %mf_getvartype(&ds,&var)=N %then %
do;
193 %
if &headerformat = SASJS %then %
do;
195 %let fmttype=%sysfunc(mcf_getfmttype(%mf_getvarformat(&ds,&var)0));
196 %
if &fmttype=DATE %then %let vfmt=DATE9.;
197 %
else %
if &fmttype=DATETIME %then %let vfmt=E8601DT26.6;
198 %
else %
if &fmttype=TIME %then %let vfmt=TIME12.;
207 if missing(&var) and &var ne %sysfunc(getoption(MISSING)) then
do;
208 &vmiss=cats(
'.',&var);
211 else put &var &vfmt &vcom &vat;
215 %
if &i ne &vcnt %then %let vcom=&delim;
216 put &var &&vlen&i &vcom &vat;