如何记录SAS中的当前步骤?

How to log the current step in SAS?

我正在尝试监视长 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 显示上一次执行的数据集的名称。

我正在寻找一种方法来查找当前数据/proc 语句名称,或任何独特的人类可读信息。

SAS 中没有针对监督级源代码处理、步骤语句收集时间(预编译)或步骤编译时间的显式内省或回调机制。

但是,您可以实施和利用(采用)执行所需操作的名称指定框架。

概念:

  • 创建一个宏,E,接受 name报道。
  • 使用 SYSECHO 通过 DOSUBL
  • 关于 name 的消息
  • 发出 name 作为源代码
  • 当您想将名称消息发送回 IOM 客户端时,请使用 %E(<name>)(在实际源代码的上下文中)

代码中的框架:

%* 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;

不是自动的,但也不那么冗长。