如何使用宏更改表列的名称(除非您指出)。数字类型列添加前缀“ XC_”,字符类型列添加前缀“ XN _”
答案 0 :(得分:3)
适当的实用程序宏将接受所有处理抽象作为参数:
data=
,用于操作的数据集copy=
,要保留的变量(复制是对TRANSPOSE中复制语句的致敬)char_prefix=XC_
,前缀,适用于未复制的字符变量的名称,默认为XC _ num_prefix=XN_
,前缀,适用于未复制的数字变量的名称,默认为XN _ 实用程序宏的内部是一个黑匣子。有时会指定内部设计以允许执行DATA和PROC步骤。
示例代码
Proc SQL
用于用一系列旧=新名称对填充宏变量,这些名称对可以在RENAME
执行的Proc DATASETS
语句中使用
%macro Fixer ( data=, copy=, char_prefix=XC_, num_prefix=XN_ );
%let syslast = &data;
%local lib mem rename_clause;
%let lib = %scan(&syslast,1);
%let mem = %scan(&syslast,2);
proc sql noprint;
select
trim(name) || '=' ||
case type
when 'num' then "&num_prefix" || name
when 'char' then "&char_prefix" || name
else ''
end
into :rename_clause separated by ' '
from
dictionary.columns
where
libname = "&lib"
and memname = "&mem"
and indexw (%upcase("©"), upcase(name)) = 0
;
proc datasets nolist;
modify &data;
rename &rename_clause;
run;
quit;
%mend;
data class;
set sashelp.class;
teacher = 'Davidowski';
run;
options mprint;
%Fixer ( data=class, copy=Name )
其他时候,内部人员不得生成任何代码。对于这个问题,这样的宏将使用宏函数%SYSFUNC
访问数据集函数,例如open
,close
,attrn
,vartype
,{{1} },它会测试重命名条件并累积将发送给被调用方使用的old = new名称对。