Logging 如何在SAS中记录当前步骤?
我正在尝试监视一个长SAS脚本的进程。开始时,我使用了类似于:Logging 如何在SAS中记录当前步骤?,logging,sas,monitoring,sas-macro,Logging,Sas,Monitoring,Sas Macro,我正在尝试监视一个长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*/
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
会显示上一次执行的数据集的名称
我正在寻找一种方法来查找当前数据/proc语句名称或任何独特的人类可读信息。SAS中没有用于监督级源代码处理、step语句收集时间(预编译)或step编译时间的显式自省或回调机制 但是,您可以实现并使用(采用)一个名称指定框架来执行所需的操作 概念:
- 创建一个宏,
,它接受要报告的名称李>E
- 关于使用
通过SYSECHO
DOSUBL
- 将名称作为源代码发出
- 当您希望将名称消息发送回IOM客户端时,请使用
%E()
- 关于使用
%* 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;
不是自动的,但没有那么详细。尝试使用您的宏,如果将
&name
放在%local
之前,它就会工作:%macro E(name)&名称%LocalRC代码>您好,谢谢您的解决方案!但它确实需要@AlexeySigida的修复才能正常工作。请更新答案,我会接受它,因为它解决了问题>TBH,我不敢相信你需要如此牵强的东西来实现合理的标准日志。答案按评论固定。Side infoDOSUBL
返回0或不返回0--%let
会“吃掉”返回值,这样宏处理器就不会将其发送到源代码流中。@Théphilepace只需等待,直到您想做一些错误处理=/