在维护别人的SAS项目时,我发现了一些代码片段,它在数据步骤中创建了一个表input-stats
。变量&all.
包含要检查的表的列表。数据步骤相当长,我在这里用/* more code */
:缩短了它
%let all = "work.table1*mywork.table2";
data input-stats;
i = 1;
do while (scan(&all., i, '*') ne '');
name = scan(&all., i, '*');
/* more code */
output;
i = i + 1;
end;
run;
我想用另一列来展开表input-stat
,列中给出了每个表的行数。我在项目中发现了以下宏可以做到这一点:
%macro count_rows(ds);
%let DSID=%sysfunc(OPEN(&DS.,IN));
%let NOBS=%sysfunc(ATTRN(&DSID.,NOBS));
%let RC=%sysfunc(CLOSE(&DSID.));
&nobs
%mend;
我现在想将此调用集成到上述数据步骤中,但很明显,我不能像在其他编程语言中那样简单地添加rows=%count_rows(name)
(例如,而不是/* more code */
(。
您将如何用最少的代码修改来解决这个问题?有没有办法不做一个巨大的%while
循环?
宏代码的功能可以通过调用相同的函数在DATA Step范围内复制。不需要使用RESOLVE
或CALL EXECUTE
时可能会混淆的宏和混合作用域。
...
name = scan(&all., i, '*');
/* more code */
* add row counting code here;
_dsid = open (name,'IN');
nobs = attrn(_dsid,'NOBS');
_dsid = close (_dsid);
drop _:;
output;
...