将SAS宏输出到文件或电子邮件附件



我在接收电子邮件发送给我的基本文件信息时遇到了一些问题。

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

%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

…然后我在20121-02-15上运行这个,然后我只得到:

ProgramA_210215.log
ProgramC_210215.log

…这正符合我的需要。

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

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

我最后想要实现的是,给我发一封电子邮件,附上今天的日志文件及其创建日期时间和最后修改日期时间。

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

使用%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; 

最新更新