我有大约 600 个要动态重命名的变量。我使用 PROC SQL 创建了一个包含变量名称的宏变量。现在它们看起来像:aayyy、abcjjjjj、bbcjjjjj 等。我想在前 2 个或 3 个字符(取决于变量)之后添加一个下划线,其余部分保持不变。所以最终变量看起来像 aa_yyy、abc_jjjjj、bbc_jjjjj。
有任何想法吗?
libname anylib "E:\";
data anylib.table1;
length aayyy eeeeee abcjjjjj bbcjjjjj abcdejd 8;
run;
data work.table2;
length aayyy abcjjjjj bbcjjjjj abcdejd 8;
run;
proc sql;
create table list as
select * from (
select libname, memname, name,
case
when
compress(substr(name, 3), substr(name, 3, 1)) = ''
then catt(substr(name, 1, 2), '_', substr(name, 3))
when
compress(substr(name, 4), substr(name, 4, 1)) = ''
then catt(substr(name, 1, 3), '_', substr(name, 4))
else '' end
as newname
from dictionary.columns
where libname in ('WORK', 'ANYLIB') and length(name) >= 5
and ( substr(name, 3, 1) = substr(name, 4, 1)
or substr(name, 4, 1) = substr(name, 5, 1)
)
) where newname is not null
order by libname, memname
;
quit;
data _null_;
set list;
length stmt $200;
file "E:\renames.sas";
by libname memname;
if first.libname then do;
stmt = 'proc datasets lib=' || libname || 'nolist nodetails;';
put stmt;
end;
if first.memname then do;
stmt = 'modify ' || memname || ';';
put stmt;
stmt = 'rename';
put stmt;
end;
stmt = ' ' || name || ' = ' || newname;
put stmt;
if last.memname then do;
stmt = ';';
put stmt;
end;
if last.libname then do;
stmt = 'quit;';
put stmt;
end;
run;
%include "E:\renames.sas";
...背后的想法compress(substr(
是找到第 3 或第 4 个字符重复直到名称结尾的名称 - compress 删除此字符并生成空字符串。然后我们在数据步骤中生成脚本PROC DATASETS
并运行(%include)它。