来自 http://bbs.pinggu.org/thread-1540523-1-1.html
使用数据步:
最简单的是使用end选项
data _null_;
set test end=last;
if last then put _n_;
run;
或者是使用nobs选项
data _null_;
set test nobs=nobs;
put nobs=;
stop;
run;
又或者
data _null_;
set test nobs=nobs;
call symputx(“nobs”,nobs);
run;
%put &nobs.;
要注意symputx和symput的区别。
nobs的不足在于当数据集经过修改或带有where选项时,不一定能得出正确结果。
使用SQL语句:
proc sql noprint;
select count(*) into:cot
from test
where x<5;
quit;
%put &cot.;
使用字典(dictionary):
proc sql;
select nobs,nvar
into:nobs,:nvar
from dictionary.tables
where libname=”WORK” and memname=”TEST”;
quit;
要注意的是,这里work和test必须大写。
使用宏(macro):
%let dsid=%sysfunc(open(test));
%let nvar=%sysfunc(attrn(&dsid,nvars));
%let nobs=%sysfunc(attrn(&dsid,nobs));
%let rc=%sysfunc(close(&dsid));
%put &nvar. &nobs.;这是最简单的一种情况,更完整的情况必须考虑数据集是否存在,是否能打开,对应宏程序如下:
%macro getobs(data);
%local dsid obsnum rc;
%let dsid=-1;
%if %sysfunc(exist(&data)) %then %let dsid=%sysfunc(open(&data,i));
%if &dsid le 0 %then
%do;
%let obsnum=.;
%put %sysfunc(sysmsg());
%end;
%else
%do;
%let obsnum=%sysfunc(attrn(&dsid,NOBS));
%let rc=%sysfunc(close(&dsid));
%end;
%put &obsnum;
%mend;
%getobs(test);Jack Hamilton等写了更完整的一种情况,多加入了以下判断程序:
SAS是否能取得观测数?数据集是否还有where选项?%let anobs=%sysfunc(attrn(&DSID,ANOBS));
%let whstmt=%sysfunc(attrn(&DSID,WHSTMT));
%if &anobs=1 & &whstmt=0 %then
%do;
%let counted=%sysfunc(attrn(&DSID,NLOBS));
%end;否则通过循环计数的方法得到观测数:%let counted=0;
%do %while(%sysfunc(fetch(&DSID))=0);
%let counted=%eval(&counted.+1);
%end;