|
板凳

楼主 |
发表于 2012-5-27 14:51:35
|
只看该作者
Re: 把每个变量的value label生成数据集
[code:2zh9vm59]
libname myfmt "c:\covance";
proc format library=myfmt;
value gender
1='UMale'
2='UFemale';
run;
proc format;
value gender
1='TFeMale'
2='TMale';
value seq
1='one'
2='two'
3='three';
run;
options fmtsearch=(myfmt work);
/*options fmtsearch=(work myfmt);*/
data raw;
input gender;
id=_n_;
format gender gender. id seq.;
datalines;
1
2
2
;
%macro searchFormat(libn=work,indsn=,outdsn=out);
%let mprintState=%sysfunc(getoption(mprint)) %sysfunc(getoption(notes));
options nomprint nonotes;
%let libn=%upcase(&libn);
%let indsn=%upcase(&indsn);
%if %sysfunc(exist(&libn..&indsn))=0 %then %do;
%put WARNING-*** DATASET &libn..&indsn DOES NOT EXIST! ***;
%goto exist;
%end;
%let fmtSearchSeq=%sysfunc(compress(%sysfunc(getoption(fmtsearch)),(),));
proc sql noprint;
create table fmtList(drop=seq) as
select libname, objname, indexw("&fmtSearchSeq",libname) as seq
from dictionary.catalogs
where objtype='FORMAT' and
objname in (select tranwrd(format,'.','') from dictionary.columns
where libname="&libn" and memname="&indsn")
group by objname
having min(ifn(seq=0,99,seq))=seq
order by libname;
quit;
data fmtList(drop=objname);
length fmtList $500;
do until(last.libname);
set fmtList;
by libname;
fmtList=catx(' ',fmtList,objname);
end;
run;
%if &sqlobs=0 %then %do;
%put WARNING-*** USER DEFINED-FORMAT DOES NOT EXIST! ***;
%goto exist;
%end;
%else %if %sysfunc(exist(&libn..&outdsn)) %then %str(proc delete data=&libn..&outdsn;run;);
%let dsid=%sysfunc(open(work.fmtList,i));
%let num=%sysfunc(attrn(&dsid,nlobs));
%if &num gt 0 %then %do;
%syscall set(dsid);
%do i=1 %to #
%let rc=%sysfunc(fetchobs(&dsid,&i));
proc format library=&libname cntlout=work._temp;
select &fmtList;
run;
proc append base=work.out data=work._temp; run;
%end;
%end;
%let rc=%sysfunc(close(&dsid));
proc delete data=fmtList _temp; run;
%if &rc=0 %then %put WARNING-*** SUCCESSFUL EXECUTED! ***;
%exist:
options &mprintState;
%mend searchFormat;
%searchFormat(indsn=raw)[/code:2zh9vm59] |
|