【问题标题】:How to log the current step in SAS?如何在 SAS 中记录当前步骤?
【发布时间】:2020-01-29 13:08:56
【问题描述】:

我正在尝试监控长 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 语句名称,或任何独特的人类可读信息。

【问题讨论】:

    标签: logging sas monitoring sas-macro


    【解决方案1】:

    SAS 中没有明确的自省或回调机制用于监督级源代码处理、步骤语句收集时间(预编译)或步骤编译时间。

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

    概念:

    • 创建一个宏 E,它接受要报告的 name
    • 关于姓名的消息使用SYSECHO通过DOSUBL
    • 发出 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;
    

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

    【讨论】:

    • 尝试使用您的宏,如果&name 放在%local:%macro E(name); &name %local rc; 之前,它就可以工作。
    • 您好,感谢您的解决方案!它确实需要@AlexeySigida 的修复才能正常工作。请更新答案,我会接受它,因为它可以解决问题> TBH,我无法相信您需要如此牵强的东西才能获得合理的标准日志。
    • 根据评论固定答案。侧面信息DOSUBL 返回 0 或不返回 0——%let '吃'返回值,因此它不会被宏处理器发送到源代码流中。
    • @ThéophilePace 等到你想做一些错误处理。 =/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2016-11-17
    • 2011-08-23
    • 1970-01-01
    • 2014-11-14
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多