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(
... чтобы найти имена, где третий или четвёртый символ повторяется до конца имени - компресс удаляет этот символ и выдает пустую строку. Затем мы создаем скрипт из PROC DATASETS
в шаге данных и запускаем его (% include).
Вам нужно больше информации здесь. Можете ли вы привести пример вашего текущего кода и некоторых примеров данных? – Joe
Его будет трудно ответить явно без явной/формальной идеи шаблона, который определяет, вставлен ли «_». В любом случае, я думаю, вам нужно будет заглянуть в функции регулярных выражений perl (PRX), учитывая, что на этом этапе шаблон выглядит довольно нерегулярно. Они могут использоваться в макрокоде через макрос% SYSFUNC(). Вы можете зацикливать шаблон PRX над каждым словом и вносить изменения в зависимости от того, соответствует ли он ... – DJM