/*原始数据的 路径 - the path of original sas dataset*/
libname in v9 "D:\XiaKeShan\数据管理\批量修改数据集的名称_LABEL_变量的名称_LABEL_长度2\原始数据" access=readonly;
/*处理后数据的 路径 - the path of processed sas dataset*/
libname out v9 "D:\XiaKeShan\数据管理\批量修改数据集的名称_LABEL_变量的名称_LABEL_长度2\处理后的数据" ;
/*清空导出库的 数据集*/
proc datasets library=out kill nolist nodetails;
quit;
/*清空work库的 数据集*/
proc datasets library=work kill nolist nodetails;
quit;
/*将 数据集名 统一为 小写*/
proc copy in=in out=out memtype=data;
run;
/********************更改变量存储长度 **********************************/
%macro change_var_len;
/*计算所有数据集中字符变量的长度*/
data _null_;
set sashelp.vcolumn(keep=libname memname name type where=(libname='OUT' and upcase(type)='CHAR')) end=last;
by memname;
if _n_=1 then call execute('proc sql;');
if first.memname then call execute(catt('create table _',memname,' as select '));
call execute(cat('max(length(',strip(name),')) as ',name));
if not last.memname then call execute(',');
else call execute(catt('from out.',memname,';'));
if last then call execute('quit;');
run;
/*将上面产生的数据集转置 wide -> long*/
data _null_;
set sashelp.vtable(keep=libname memname where=(libname='WORK' and memname =: '_'));
call execute(catt('proc transpose data=',memname,' out=_',memname,';run;'));
run;
/*合并转置的数据集*/
data change_var_len;
length _name_ $ 40;
set __: indsname=indsname;
dsn=indsname;
run;
/*计算变量在所有数据集中的 最长长度*/
proc sql;
create table change_var_len_1 as
select *,substr(dsn,8) as new_dsn length=40,max(col1) as max_len
from change_var_len
where col1 is not missing
group by _NAME_
order by dsn;
quit;
/*按变量的最长长度 修改数据集中所有变量的长度*/
data _null_;
set change_var_len_1 end=last;
by dsn;
if _n_=1 then call execute('proc sql;');
if first.dsn then call execute(catt('alter table out.',new_dsn,' modify '));
call execute(catt(_name_,' char(',max_len,')'));
if not last.dsn then call execute(',');
else call execute(catt(';'));
if last then call execute('quit;');
run;
%mend;
%change_var_len
... View more