使用SQL步或DATA步与Macro的结合,可以完成进行批量数据处理的要求。比如说对任意的数据集进行数据清洗,建模前变量的筛选等等。基本的思路都是从SAS的数据字典里面提取变量信息,然后针对提取的变量进行操作。首先列出SAS的数据字典,这些表只能用SQL过程访问。DICTIONARY.LIBNAMES–关于SAS逻辑库的一般信息
DICTIONARY.MEMBERS–关于SAS逻辑库成员的一般信息
DICTIONARY.TABLES–关于表的详细信息
DICTIONARY.VIEWS–关于所有数据视图的详细信息
DICTIONARY.CATALOGS–关于目录条目的信息
DICTIONARY.COLUMNS–关于所有表中的所有列的详细信息
DICTIONARY.INDEXES–表定义的索引
DICTIONARY.TABLE_CONSTRAINTS–所有表的完整性约束
DICTIONARY.CHECK_CONSTRAINTS–检查所有的约束
DICTIONARY.REFERENTIAL_CONSTRAINTS–所有表的参照约束
DICTIONARY.CONSTRAINT_COLUMN_USAGE–完整性约束引用的列
DICTIONARY.CONSTRAINT_TABLE_USAGE–使用完整性约束的表
DICTIONARY.MACROS宏变量名称和值
DICTIONARY.OPTIONSSAS系统选项的当前设置
DICTIONARY.TITLES当前分配给标题和脚注的文字
DICTIONARY.EXTFILES 当前分配的文件引用名
以下以批量重命名变量名为例。
/*第一步获取需要操作的变量数量,将该值存入宏变量中*/ proc sql ;
select name
from dictionary.columns
where libname='SASHELP' and
upcase(memname)='CLASS';
%let Rows=&SQLOBS;/*&SQLOBS为系统在运行SQL步后自定义的宏变量,After the first query, SQLOBS contains the number
of rows (tiers).
*/
/*%put &Rows; */
/*第二步获取原有表中变量的名字,并存入宏变量数组*/
proc sql noprint;
select name into :var1-:var&Rows
from dictionary.columns
where libname='SASHELP' and
upcase(memname)='CLASS';
/* %put &var1 &var2;*/
quit;
/* 第三部,修改表内变量的名成,建议另外创建一张表,而不是修改原有表内的变量名 */
data test;set sashelp.class;run;
%macro rename;
%Do i=1 %to &Rows;
data test(rename=(&&var&i=%SYSFUNC(cat(&&var&i, &i))));
set test;
run;
%end;
%Mend rename;
%rename