将 SAS 宏输出到文件或电子邮件附件
Output SAS macro to file or email attachment
我在获取通过电子邮件发送给我的基本文件信息时遇到了一些问题。
根据互联网上的各种脚本,我最终得到了以下宏,它适用于输出我想要的信息。
%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。
我最终想要实现的是,向我发送一封电子邮件,其中包含今天的日志文件及其创建日期时间和上次修改日期时间。
我想我只是错过了一个简单的步骤,但无法弄清楚是哪个:(。
使用 %SYSFUNC() 调用所有这些函数只会让你更难做你想做的事。只需在数据步骤中调用函数,这样您就有了一个包含文件的实际数据集。然后您可以使用多种方法中的任何一种将列表定向到您想要的任何位置,包括发送电子邮件。
我很确定 FINFO() 总是 returns 字符串,因此请确保目标变量足够长以返回值。请注意,FINFO() 中可用的信息取决于 SAS 所在的操作系统 运行。因此请确保您使用的名称适合您的 SAS 会话。
%let dir=c:\logs\;
data file_list;
length filrf fref name 6 ymd CreatedDT ModifiedDT ;
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;
我在获取通过电子邮件发送给我的基本文件信息时遇到了一些问题。
根据互联网上的各种脚本,我最终得到了以下宏,它适用于输出我想要的信息。
%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。
我最终想要实现的是,向我发送一封电子邮件,其中包含今天的日志文件及其创建日期时间和上次修改日期时间。
我想我只是错过了一个简单的步骤,但无法弄清楚是哪个:(。
使用 %SYSFUNC() 调用所有这些函数只会让你更难做你想做的事。只需在数据步骤中调用函数,这样您就有了一个包含文件的实际数据集。然后您可以使用多种方法中的任何一种将列表定向到您想要的任何位置,包括发送电子邮件。
我很确定 FINFO() 总是 returns 字符串,因此请确保目标变量足够长以返回值。请注意,FINFO() 中可用的信息取决于 SAS 所在的操作系统 运行。因此请确保您使用的名称适合您的 SAS 会话。
%let dir=c:\logs\;
data file_list;
length filrf fref name 6 ymd CreatedDT ModifiedDT ;
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;