不管是写listing,还是table,都有可能遇到数据集为空的情况,如果不加以判断,且用到proc sql对数据集进行处理,都有可能报错。因此,先判断数据集是否为空,再进行下一步的操作至关重要。
判断数据集是否有观测有很多种方法,这里提供两种:
第一种:
data _null_;
if 0 then set sashelp.class nobs=nobs;
call symputx('nobs',nobs);
stop;
run;
if 0 就是"假",不读取数据(0在计算机语言不就是假吗),然后很多人喜欢写成nobs=nobs,导致很多人分不清哪个是系统选项,哪个是你自己设定的变量.
nobs=cc这样就清楚多了,前面一个是系统选项,后面是自己命名的东西,nobs选项将数据集观测数量赋值给cc,但是这个“变量”并不会显示出来,所以我们需要创建一个宏变量,这个宏变量的值是cc.
data test;
if 0 then set sashelp.class nobs=cc;
call symputx('zz',cc);
stop;
run;
%put &zz;
第二种:
data test;
rc = open('sashelp.class');
test = attrn(rc,'nobs');
run;
说明:open的作用就是打开数据集,只要是SAS数据集,open都可以打开,如果数据集不存在的话会报错。rc是随便取得一个变量名,你换成cc,zz任何符合SAS变量名规则的都可以。如果存在这个数据集,就会显示“1”,否则“0”。
attrn,它还有一个兄弟,是attrc:
作用都是Return the value of an attribute for a SAS table
它们有许多参数可以选择,不同的参数能实现不同的功能。
就拿attrn的“any”选项来说,
data test;
rc = open('sashelp.class');
test = attrn(rc,'any');
run;
test值返回1,说明这个数据集既有“行(row)”又有“列(column)”,我们选择"NOBS"选项判断数据集是否有观测。其他选项自己可以查看SAShelp文档
不管是第一种方法还是第二种,好像还没达到我们的要求,我们将观测数量判断出来了,但是怎么调用呢?其实最终还是要写一个宏,然后把判断数据集不存在观测以及不存在观测怎么处理都写在宏里面,就可以完成要求了。
%macro test;
data drh;
set sashelp.classfit;
if _n_<1;
run;
data test;
rc = open('drh');
test = attrn(rc,'ANY');
call symputx('zz',test);
run;
%if &zz^=0 %then %do;
data test2;
set sashelp.cars;
run;
%end;
%else %do;
%put no data;
%end;
%mend;
%test;
I'm done!