Sas 从数据步骤中调用宏
在维护其他人的SAS项目时,我发现了一些代码片段,它在数据步骤中创建了一个表Sas 从数据步骤中调用宏,sas,row,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 ''); na
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;
现在,我想在上述数据步骤中集成此调用,但显然,我不能像在其他编程语言中那样简单地添加行=%count\u行(名称)
(例如,而不是/*更多代码*/
)
如何以最少的代码修改来解决这个问题?有没有一种方法可以在循环时不产生巨大的
%?通过调用相同的函数,可以在数据步骤范围内复制宏代码的功能。使用RESOLVE
或callexecute
时,不需要宏和混合作用域,这可能会造成混淆
...
name = scan(&all., i, '*');
/* more code */
* add row counting code here;
_dsid = open (name,'IN');
nobs = attrn(_dsid,'NOBS');
_dsid = close (_dsid);
drop _:;
output;
...
简单干净的解决方案,我没有想到。。。