| 
 | 
板凳
 
 
 楼主 |
发表于 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] |   
 
 
 
 |