2013-09-25 3 views
-1

У меня около 600 переменных, которые я хочу переименовать динамически. Я использовал PROC SQL для создания макропеременной, содержащей имена переменных. Прямо сейчас они выглядят так: aayyy, abcjjjjj, bbcjjjjj и т. Д. Я хочу добавить подчеркивание после первых двух или трех символов (в зависимости от переменной) и сохранить остальное то же самое. Таким образом, конечные переменные будут выглядеть как aa_yyy, abc_jjjjj, bbc_jjjjj.Переименовывает переменные SAS для добавления подчеркивания

Любые идеи?

+0

Вам нужно больше информации здесь. Можете ли вы привести пример вашего текущего кода и некоторых примеров данных? – Joe

+0

Его будет трудно ответить явно без явной/формальной идеи шаблона, который определяет, вставлен ли «_». В любом случае, я думаю, вам нужно будет заглянуть в функции регулярных выражений perl (PRX), учитывая, что на этом этапе шаблон выглядит довольно нерегулярно. Они могут использоваться в макрокоде через макрос% SYSFUNC(). Вы можете зацикливать шаблон PRX над каждым словом и вносить изменения в зависимости от того, соответствует ли он ... – DJM

ответ

3
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).

Смежные вопросы