|
|
沙发

楼主 |
发表于 2009-8-28 22:47:09
|
只看该作者
Re: 请教
[code:3jplabrv]%macro chr_to_num(inds,outds,chr_var,keep_chr=yes);
options nosymbolgen mprint;
%if %upcase(&keep_chr)=NO %then %do;
%local varlist;
%let dsid=%sysfunc(open(&inds,i));
%syscall set(dsid);
%let nvar=%sysfunc(attrn(&dsid,nvar));
%do i=1 %to &nvar;
%let varlist=&varlist %sysfunc(varname(&dsid,&i));
%end;
%let rc=%sysfunc(close(&dsid));
%end;
proc sql;
create table &chr_var._list as
select distinct upcase(&chr_var) as name from &inds;
quit;
%if %index(&outds,'.')=0 %then %let outlib=work;
%else %let outlib=%scan(&outds,1,'.');
%do i=1 %to 2;
data &chr_var._fmt;
set &chr_var._list;
fmtname="&chr_var._fmt";
%if &i=1 %then %do;
type='c';
rename name=start;
label=_n_;
%end;
%else %do;
type='n';
start=_n_;
rename name=label;
%end;
run;
proc format library=&outlib cntlin=&chr_var._fmt;
run;
%end;
data &outds;
set &inds;
%upcase(&chr_var._num)=input(put(upcase(&chr_var),$&chr_var._fmt.),best8.);
%if %upcase(&keep_chr)=NO %then %do;
drop &chr_var;
rename &chr_var._num=%upcase(&chr_var);
%end;
format &chr_var._num &chr_var._fmt.;
run;
%if %upcase(&keep_chr)=NO %then %do;
data &outds;
retain &varlist;
set &outds;
run;
%end;
proc datasets library=work nolist nodetails;
delete &chr_var._list _temp_raw /memtype=data;
quit;
proc catalog cat=&outlib..formats;
delete &chr_var._fmt /et=formatc;
quit;
%mend chr_to_num;
data raw;
input ID $ A1A $20.;
datalines;
270023 好
000006 一般
000019 一般
340025 较好
130021 较差
0601 一般
110023 好
0614 较差
340023 aaaa
130006 AAaa
270030 较好
200033 差
200005 好
030014 bb
050025 ccccccCCCCcccccccccc
;
%chr_to_num(raw,work.temp,a1a)
/*%chr_to_num(raw,work.temp,a1a,keep_chr=no)*/[/code:3jplabrv] |
|