我正在尝试监视长 SAS 脚本的进度。一开始,我使用了类似的东西:
DATA work.dataset1;
SYSECHO "Currently working on: work.dataset1";
/* DO STUFF*/
END;
PROC SORT DATA=work.dataset1 OUT = work.work.dataset2;
SYSECHO "Currently working on: work.dataset2";
/* DO STUFF*/
END;
.....
DATA work.datasetn;
SYSECHO "Currently working on: work.datasetn";
/* DO STUFF*/
END;
但是,这非常难以维护并且非常冗长。因此,我尝试创建一个宏,它会自动获取步骤名称或步骤数据集(或任何让我知道当前正在运行的步骤的信息)并将其传递给 SYSECHO
:
%macro nstep;
SYSECHO "Finished Processing &SYSLAST";
%mend;
DATA work.dataset1;
%nstep;
/* DO STUFF*/
END;
但是,这实际上打印了最后一个受影响的数据集,而不是当前的数据集。因此,执行第一个步骤时,该行为尤其有问题,第一次使用 %nstep
显示上一次执行的数据集名称。
我正在寻找一种方法来查找当前的数据/过程语句名称,或任何独特的人类可读信息。
最佳答案
SAS 中没有用于监督级源代码处理、步骤语句收集时间(预编译)或步骤编译时间的显式自省(introspection)或回调机制。
但是,您可以实现并利用(采用)执行所需操作的名称指定框架。
概念:
- 创建宏,
E
,接受举报姓名。 - 关于姓名的消息,使用
SYSECHO
通过DOSUBL
- 将名称作为源代码发出
- 使用
%E(<name>)
(在实际源代码的上下文中)当您想要将名称消息发送回 IOM 客户端时
代码中的框架:
%* part of autoexec, autocall, or specified macro library;
%macro E(name);
&name
%local rc;
%let rc = %sysfunc(DOSUBL(%nrstr(
%put NOTE: SYSECHOing &name; /* The put NOTE: can be removed if you want */
SYSECHO "Working on &name";
)));
%mend;
DATA %E(work.dataset1);
/* DO STUFF*/
RUN;
PROC SORT DATA=work.dataset1 OUT = %E(work.dataset2);
/* DO STUFF*/
RUN;
…
DATA %E(work.dataset27);
/* DO STUFF*/
END;
不是自动的,但也不那么冗长。
关于logging - 如何在SAS中记录当前步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59967821/