从数据步骤中调用宏

  • 本文关键字:调用 数据 sas row
  • 更新时间 :
  • 英文 :


在维护别人的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范围内复制。不需要使用RESOLVECALL 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;
...

相关内容

  • 没有找到相关文章

最新更新