这是我以前实习时写的宏,希望对你有帮助:
data a;
attrib usubjid length = 8;
attrib RFSTDT length = $8;
usubjid = 12345;
x='aaa';
RFSTDT = '12345';output;
run;
data b;
input NAME $ TYPE;
cards;
RFSTDT 1
USUBJID 2
;
run;
%macro ADM_TYPE(in=,out=&in.);
proc contents data = &in. out = ADM_TEMP3;run;
data ADM_TEMP3(keep = NAME TYPE1);set ADM_TEMP3;
NAME = upcase(NAME);
TYPE1 = TYPE;
run;
%let ADM_TYPE_ALLVAR=;
%let ADM_TYPE_ALLCHAR_TEMP=;
%let ADM_TYPE_ALLNUM_TEMP=;
proc sort data = ADM_TEMP3;by NAME;run;
proc sort data = b;by NAME;run;
data ADM_TEMP4;
merge ADM_TEMP3 b(keep = NAME TYPE in = yes);
by NAME;
if TYPE ^= TYPE1 and yes then do;
call symputx('ADM_TYPE_ALLVAR',symget('ADM_TYPE_ALLVAR')||' '||strip(NAME));
end;
run;
data _null_;
set &in.;
array ADM_TYPE_ALLCHAR _char_;
array ADM_TYPE_ALLNUM _numeric_;
if _N_ = 1 then do;
do over ADM_TYPE_ALLCHAR;
call symputx('ADM_TYPE_ALLCHAR_TEMP',symget('ADM_TYPE_ALLCHAR_TEMP')||' '||upcase(vname(ADM_TYPE_ALLCHAR)));
end;
do over ADM_TYPE_ALLNUM;
call symputx('ADM_TYPE_ALLNUM_TEMP',symget('ADM_TYPE_ALLNUM_TEMP')||' '||upcase(vname(ADM_TYPE_ALLNUM)));
end;
end;
run;
data &out.;set &in.;
%do i = 1 %to %eval(%sysfunc(count(&ADM_TYPE_ALLCHAR_TEMP.,%str( ))) + 1);
%let ADM_TYPE_WHICH = %scan(&ADM_TYPE_ALLCHAR_TEMP.,&i.);
%if %index("&ADM_TYPE_ALLVAR",&ADM_TYPE_WHICH.) %then %do;
&ADM_TYPE_WHICH._X = input(&ADM_TYPE_WHICH.,best.);
drop &ADM_TYPE_WHICH.;
rename &ADM_TYPE_WHICH._X = &ADM_TYPE_WHICH.;
%end;
%end;
%do i = 1 %to %eval(%sysfunc(count(&ADM_TYPE_ALLNUM_TEMP.,%str( ))) + 1);
%let ADM_TYPE_WHICH = %scan(&ADM_TYPE_ALLNUM_TEMP.,&i.);
%if %index("&ADM_TYPE_ALLVAR",&ADM_TYPE_WHICH.) %then %do;
&ADM_TYPE_WHICH._X = strip(put(&ADM_TYPE_WHICH.,best.));
drop &ADM_TYPE_WHICH.;
rename &ADM_TYPE_WHICH._X = &ADM_TYPE_WHICH.;
%end;
%end;
run;
%mend ADM_TYPE;
%ADM_TYPE(in=a,out=c);


雷达卡



京公网安备 11010802022788号







