在工作中,有时一些操作只针对记录数不为0的数据集进行操作,在处理时,就需要提前判断。
程序思路介绍
判断的思路不复杂,主要就是获取数据集的记录数。我常用的程序如下,其中省略号的部分是对记录数不为0的数据集具体处理。
我最近做的是,只将记录数不为0的数据集转化成XPT文件,省略号处为转XPT的宏程序。
%macro data(lib=, dt=);
%if %sysfunc(exist(&lib..&dt.)) %then %do;
proc sql noprint;
select nobs into: nobs
from dictionary.tables
where libname = upcase("&lib.") and memname = upcase("&dt.")
;
quit;
%if &nobs > 0 %then %do;
......
%end;
%end;
%mend data;
根据数据集记录是否为0 ,可以将数据集分为两类。但是这有一个前提,就是这个数据集得存在。如果数据集不存在,下面的程序也不会有意义。判断数据集是否存在,使用的是exist
函数,具体用法可以参考SAS Help Center: EXIST Function。
如果去掉判断数据集是否存在的语句,SQL生成宏变量nobs
的程序可以正常运行,但不会生成宏变量,下面判断语句中引用宏变量nobs
时就会有Warning。
SAS字典的访问
数据集的观测数,是通过SAS字典来获取,给大家展示一下SAS字典中的具体内容,可以根据需要将字典中的信息保存到宏变量中,方便使用。
proc sql noprint;
create table tables as
select *
from dictionary.tables
where libname = upcase("sashelp")
;
quit;
Tables
上面是通过SQL语句访问SAS字典,我们也可以通过DATA步进行访问SAS字典,访问之后也可以使用call symputx
语句将需要的信息保存到宏变量中。
data tables;
set sashelp.vtable
where libname = upcase("sashelp") and memname = "CLASS";
call symputx("nobs", strip(nobs, best.));
run;
以上两个程序对比,SQL和Data步所取的SAS字典的数据集是不同的,dictionary.xxxx
这一类数据集只能在SQL语句中进行调用, sashelp.vxxxx
在SQL和Data步中都可以调用。两类数据集的命名也有区别,dictionary
中,以s
结尾,sashelp
中以v
开头。我们可以看一下,SAS字典中有哪些数据集。
proc sql noprint;
create table tmp as
select *
from sashelp.vtable
where libname = "SASHELP" and substr(memname, 1,1)="V"
;
quit;
SAS字典
常用的SAS字典有macros, tables, columns,感兴趣的读者可以自己运行下程序,看一下这几个数据集中保存的信息。
总结
这篇文章介绍了只对记录数不为0的数据集进行操作的宏程序,也介绍了SAS字典的两种访问方式,希望对读者SAS编程有帮助。
网友评论