data _TMP_;
set &data;
run;/*保留原始数据集,特别是在out不等于data时,保留原始数据在工作中很重要。*/
proc sql noprint ;
select upcase(name) into :var separated by ' '
from dictionary.columns
where libname="&a" and memname="&b";
quit;
/*取原始数据中变量的顺序,将变量依照原始顺序存入宏变量var。使转换后仍按此顺序排列*/
proc sql ;
create table char as
select * from &data (keep= _character_ );
run;/*取原始数据集中所有字符变量组成数据集*/
proc contents data=char position out=content(keep=name varnum) noprint;
run;/*取字符型数据集中变量名*/
proc sort data=content;
by varnum;
proc sql noprint;
select name into: name separated by ' '
from content order by varnum;
select 'T_'||compress(name)||'_1' into: name_1 separated by ' '
from content order by varnum;
select 'T_'||compress(name)||'_2' into: name_2 separated by ' '
from content order by varnum;
quit;/*将字符型数据集中的变量名按序存入name宏变量,同时产生两列新变量用于存放中间结果*/
DATA _Tmp_/*(drop=i _C_)*/;
set _TMP_;
if compress(&cha)='' then &r1+0;
else do;
if compress(&cha,'.','d')='' then &r1+0;else &r1+1;
end;
if &r1=0 then do;
&num=&cha-0;
call symput('dropn',"&dropn."||" "||"&cha.");
call symput('renan',"&renan."||" "||"&num.");
call symput('n',%eval(&n+1));
end;
if &r1>0 then do;
call symput('dropc',"&dropc."||" "||"&num.");
end;
RUN;
%end;
data &out;
set _TMP_(drop=&dropc &name_2);
%do s=1 %to &n;
%let cha=%scan(&dropn,&s);
drop &cha;
%let num=%scan(&renan,&s);
rename &num=&cha;
%end;
run;