myth916031 发表于 2014-10-8 11:46 
同问,该怎么办
/*批量修改变量类型*/
/*将dataset2中与dataset1重合的变量的变量类型修改为与dataset1一致*/
%macro vartypeconvert(dataset1, dataset2, varcom);
data a;
set &dataset1;
keep &varcom;
run;
data b;
set &dataset2;
keep &varcom;
run;
proc contents data=a
out=var_dataset1(keep=name type length) noprint;
run;
proc contents data=b
out=var_dataset2(keep=name type length) noprint;
run;
proc sql noprint;
create table var_common as
select *
from var_dataset1 a inner join var_dataset2 b
on a.name=b.name;
quit;
%let dsid1 = %sysfunc ( open ( var_common, is ) );
%let num_var = %sysfunc ( attrn ( &dsid1, nobs ) ); %*得到需要修改的变量个数;
%let rc = %sysfunc ( close ( &dsid1 ) );
%do j = 1 %to &num_var;
data null;
set var_common;
if _n_ = &j;
call symput('var_name',name); *读取重合变量的变量名并赋值给var_name;
call symput('var_type',type);
call symput('var_length',length);
run;
%if &var_type=1 %then %do;
%let typenew=%sysfunc(cat(&var_length, .));
data &dataset2;
set &dataset2;
newvar = input(&var_name, &typenew);
format newvar &typenew;
informat newvar &typenew;
drop &var_name;
rename newvar = &var_name;
run;
%end;
%if &var_type=2 %then %do;
%let typenew=%sysfunc(cat($, &var_length, .));
data &dataset2;
set &dataset2;
newvar = input(&var_name, &typenew);
format newvar &typenew;
informat newvar &typenew;
drop &var_name;
rename newvar = &var_name;
run;
%end;
%end;
%mend vartypeconvert;
%put "批量修改变量类型";
%put "将dataset2中与dataset1重合的变量的变量类型修改为与dataset1一致";
%put "调用语句:% vartypeconvert(dataset1= , dataset2= , varcom= )";
/*dataset1,dataset2是两个数据集,varcom就是需要把类型修改为一致的变量,多个变量用空格隔开*/