【问题标题】:Output SAS macro to file or email attachment将 SAS 宏输出到文件或电子邮件附件
【发布时间】:2021-02-15 15:01:07
【问题描述】:

我在通过电子邮件将基本文件信息发送给我时遇到了一些问题。

从互联网上的各种脚本中,我得到了以下宏,该宏用于输出我想要的信息。

%macro list_files(dir);
    %local filrf rc did memcnt name i;
    %let rc=%sysfunc(filename(filrf,&dir));
    %let did=%sysfunc(dopen(&filrf));      
    %let ymd = %sysfunc(putn(%sysfunc(today()).,yymmdd6.));

    %if &did eq 0 %then %do; 
        %put Directory &dir cannot be open or does not exist;
        %return;
    %end;

    %do i = 1 %to %sysfunc(dnum(&did));   
        %let name=%qsysfunc(dread(&did,&i));

        %if %qscan(%qscan(&name,1,_,b),1,.) eq &ymd. %then %do;

            %let rc=%sysfunc(filename(fref,&dir\&name));
            %let fid=%sysfunc(fopen(&fref));

            %let CreatedDT=%qsysfunc(finfo(&fid,Create Time));
            %let ModifiedDT=%qsysfunc(finfo(&fid,Last Modified));

            %put &dir\&name,&CreatedDT,&ModifiedDT;

            %let fid=%sysfunc(fclose(&fid));
            %let rc=%sysfunc(filename(fref));
        %end;
    %end;
    %let rc=%sysfunc(dclose(&did));
    %let rc=%sysfunc(filename(filrf));     

%mend list_files;
%list_files(C:\logs\);

注意:宏确实需要特定的文件名格式才能工作。例如,如果我有以下日志文​​件:

ProgramA_210215.log
ProgramA_210214.log
ProgramA_210213.log
ProgramB_210214.log
ProgramB_210213.log
ProgramC_210215.log
ProgramC_210214.log
ProgramC_210213.log

...我在 2021-02-15 运行它,然后我只得到:

ProgramA_210215.log
ProgramC_210215.log

...非常适合我的需求。

我的问题是,我不知道如何将输出作为电子邮件发送给我,或者将输出转储到文件中,然后我可以将其附加到电子邮件中。

注意 2:我最初将宏写为“普通数据调用”(?),除了 CreateDT 和 ModifiedDT 之外,所有文件都可以正常工作,它们对于所有文件都是静态的。宏版本至少可以工作并显示正确(和不同)的 CreateDT 和 ModifiedDT。

我最终想要实现的是,向我发送一封电子邮件,其中包含今天的日志文件及其创建日期时间和上次修改日期时间的附件。

我想我只是错过了一个简单的步骤,但不知道是哪一个:(。

【问题讨论】:

  • 嗨!我们在这里尽量保持每个问题一个问题。如果您想将后续问题作为一个单独的问题提出,那么这样做是合适的。谢谢!

标签: email sas output attachment sas-macro


【解决方案1】:

使用 %SYSFUNC() 调用所有这些函数只会让你更难做你想做的事。只需在数据步骤中调用函数,以便您拥有包含文件的实际数据集。然后,您可以使用多种方法中的任何一种将列表指向您想要的任何位置,包括发送电子邮件。

我很确定 FINFO() 总是返回字符串,因此请确保目标变量足够长以接收返回的值。请注意,FINFO() 提供的信息取决于运行 SAS 的操作系统。因此,请确保您使用的名称适合您的 SAS 会话。

%let dir=c:\logs\;

data file_list;
  length filrf fref $8 name $256 ymd $6 CreatedDT ModifiedDT $40;
  ymd = put(today(),yymmdd6.);

  rc=filename(filrf,"&dir");
  did=dopen(filrf);      
  if did=0 then do;
    put "Directory &dir cannot be open or does not exist.";
    stop;
  end;
  do i = 1 to dnum(did);
     name=dread(did,i);
     if scan(scan(name,1,'_','b'),1,'.') eq ymd then do;
        rc=filename(fref,"&dir\"||name);
        fid=fopen(fref);
        CreatedDT=finfo(fid,'Create Time');
        ModifiedDT=finfo(fid,'Last Modified');
        output;
        fid=fclose(fid);
        rc=filename(fref);
     end;
  end;
  rc=dclose(did);
  rc=filename(filrf);
  keep name CreatedDT ModifiedDT ;
run; 

【讨论】:

  • 非常感谢@Tom。我相信定义变量的长度一定可以解决问题。使用您的代码,我现在确实可以看到不同的时间戳:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2020-11-21
相关资源
最近更新 更多