Вместо того, чтобы использовать данные отображения в ряде случаев, когда в предложениях, в долгосрочной перспективе, ваши методы управления и кодирования могут рекомендовать использовать контрольные данные , которые управляют процессом переименования. Управляющие данные могут находиться в постоянной библиотеке и изменяться только по мере необходимости. В приведенных здесь примерах используется библиотека WORK
для удобства и демонстрации.
Некоторые примеры переименования управляющих данных
Пример 1
Набор данных: Like_name_map
LIKE NEW_NAME
---------------------------------
Quantity Value% Quantity Value
Value at% Value
Yield Exp% Yield Exp
Пример 2 Набор данных: Regex_name_map
PATTERN NEW_NAME
-----------------------------------------------
^(.+)( at)? *\d{1,2}\/\d{1,2}\/\d{4}$ $1
Перезапись всего набора данных для простого переименования столбцов может быть ресурсоемкой, особенно если таблица большая или имеет ограничения. Proc DATASETS
может использоваться для выполнения переименования и изменяет только часть заголовка существующего набора данных.
Пример 1 - управляющими данными являются карты схожих шаблонов
data base1 base2;
infile cards missover;
input
NAME $
'Quantity Value at 31/12/2019'n $
'Value at 31/12/2019'n $
'Yield Exp 31/12/2019'n $
z
; datalines;
FIDO 12 F 1 3
ALFA 20 2 4 1
BETA 3 5 2 4
ETA 2 B65 0 1
THETA 14 A40 10 5
run;
data work.like_name_map; length like $32 new_name $32;input
LIKE& NEW_NAME&; datalines;
Quantity Value% Quantity Value
Value at% Value
Yield Exp% Yield Exp
;
%macro rename_by_like(data, control=work.like_name_map);
%local lib mem index;
%let syslast = &data;
%let lib = %scan(&syslast,1);
%let mem = %scan(&syslast,2);
%if %sysfunc(exist(work.__contents)) %then %do;
proc sql; drop table __contents;
%end;
proc contents noprint data=&data out=__contents(keep=name);
/* utilize the control data for locating matches and applying naming map */
proc sql;
select quote(trim(__contents.name))||'n='||quote(trim(control.new_name))||'n' as rename
into :__rename1-
from __contents
join &control as control
on upcase(__contents.name) like upcase(trim(control.like))
;
quit;
%if &sqlobs %then %do;
proc datasets nolist lib=&lib;
modify &mem;
rename
%do index = 1 %to &sqlobs;
&&__rename&index
%end;
;
quit;
%end;
%mend;
%rename_by_like(base1)
будет записывать
NOTE: The execution of this query involves performing one or more Cartesian product joins that
can not be optimized.
NOTE: PROCEDURE SQL used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
NOTE: Renaming variable 'Quantity Value at 31/12/2019'n to 'Quantity Value'n.
NOTE: Renaming variable 'Value at 31/12/2019'n to Value.
NOTE: Renaming variable 'Yield Exp 31/12/2019'n to 'Yield Exp'n.
NOTE: MODIFY was successful for WORK.BASE1.DATA.
NOTE: PROCEDURE DATASETS used (Total process time):
Пример 2 - управляющими данными являются карты Perl шаблонов регулярных выражений
data work.regex_name_map; length pattern $100 new_name $32; input
pattern& new_name&; datalines;
^(.+?)( at)? *\d{1,2}\/\d{1,2}\/\d{4}$ $1
;
%macro rename_by_regex(data, control=work.regex_name_map);
%local lib mem index;
%let syslast = &data;
%let lib = %scan(&syslast,1);
%let mem = %scan(&syslast,2);
%if %sysfunc(exist(work.__contents)) %then %do;
proc sql; drop table __contents;
%end;
proc contents noprint data=&data out=__contents(keep=name);
proc sql;
select
quote(trim(__contents.name))||'n' ||
'=' ||
quote(prxchange('s/'||trim(control.pattern)||'/'||trim(control.new_name)||'/',
1,
trim(__contents.name)
))||'n'
into :__rename1-
from __contents
join &control as control
on prxmatch('/'||trim(control.pattern)||'/i', trim(__contents.name));
quit;
%if &sqlobs %then %do;
proc datasets nolist lib=&lib;
modify &mem;
rename
%do index = 1 %to &sqlobs;
&&__rename&index
%end;
;
quit;
%end;
%mend;
%rename_by_regex(base2)