很久很久以前,有人问小编:SAS如何实现发邮件的功能,小编尴尬的反问道:SAS居然还能发邮件?是的,SAS可以实现发邮件的功能。以前觉得这个功能好鸡肋,现在小编变赖了,想将一切都交个SAS去实现半自动化乃至全自动化。在运行完SAS程序后,自动将产生的结果发给指定的人。
适用场景:SAS 程序已经调试并测试完成,无bug。如果程序有漏洞,在你执行完后,将有错误的结果对外发送了,那你就尴尬了。比较适合向小编这种对自己的程序有充分的“自信”的人。。更适合向小编这样自吹自擂天下一绝的人群。。
code
01
Options
设置邮箱
optionsemailsys=SMTP;
optionsemailauthprotocol=LOGIN;
optionsemailhost="smtp.126.com";/*设置邮箱*/
optionsemailpw="xxxx";/*设置邮箱密码*/
optionsemailport=25;
NOTE:小编这里用的126邮箱,163等邮箱都是类似的。但是QQ邮箱是不信的,QQ非企业邮箱为啥不行,小编也不知道,腾讯的企业邮箱是可以的,小编公司的邮箱是腾讯企业邮箱。
optionsemailsys=SMTP;
optionsemailauthprotocol=LOGIN;
optionsemailhost="smtp.exmail.qq.com";
optionsemailpw="xxxx";
optionsemailport=25;
02
Send
all
data_null_;
subject="SAS output"/*主题*/
attach=("A:\Macros.zip");/*附件*/
put' Daer,';
put' ';
put'Please see attachment for the SAS Output Result . ';
put'Any question, pls contact me freely andtimely, thanks. ';
put' ';
put'Best regards, ';
put' ';
put'gongnxc ';
run;
filenamemymailclear;
看完是不是发现简单,恩,确实很简单的。但是有没有发现我添加的附件的.zip文件。压缩包的好处有多个,可以节约上传时间。也避免多个附件重复添加的繁琐。那么问题来了,SAS输出的报表,还是要人工去压缩打包成压缩包啊,并没有实现全自动化啊。不,SAS可以把文件夹,文件打包。SAS语言虽然不可以(小编目前见识短浅暂时还没有发现SAS语言有这个功能,如有大神知道,还请留言相关,万谢!),但是我们可以在SAS中借用第三方语言,如Python语言。然后在通过SAS调用Python语言去实现该功能。
Python:将文件夹压缩成zip Code(此代码通过SAS生成)
代码
1.先引入一个辅助Macro,检查一个文件是否存在
%macrodde_file_yn(myfilerf);
%local_Localhave;
%if%sysfunc(fileexist(&myfilerf))%then%do;
%putNOTE:The external file &myfilerfdoes exist.;
%let_Localhave=1;
%end;
%else%do;
%putNOTE:The external file &myfilerfdoes not exist.;
%let_Localhave=0;
%end;
&_Localhave.
%menddde_file_yn;
2.sas生成zip文件(本质Python生成zip)
%macropyh_file2zip(filepath=,outpath=,zipname=);
/*此处创建一个St_Excute_temp.txt的文件,是为了在后面检查zip是否完全压缩成功,在zip完全压缩成功后,Python代码将执行删除该.txt文件,然后SAS通过判断.txt文件是否存在,在去判断zip文件是否完全压缩成功*/
data _NULL_;
file"&outpath.\St_Excute_temp.txt"encoding="utf-8"lrecl=30000;
run;
options noxsync noxwait;
/*Create a Python Code*/
data _NULL_;
file"&outpath.\file2zip.py"encoding="utf-8"lrecl=30000;
put"import zipfile";
put"import os";
put"z=zipfile.ZipFile(r'&outpath.\&zipname..zip', 'w', zipfile.ZIP_DEFLATED)";
put"startdir = '&filepath.'";
put"for dirpath, dirnames, filenames in os.walk(startdir):";
put" for filename in filenames:";
put"z.close()";
run;
data _null_;
%if%dde_file_yn(&outpath.\file2zip.py)=%then%do;
%putNOTE: Please wait a little,The Python Code will be Created...;
%end;
%do%until(%dde_file_yn(&outpath.\file2zip.py)=1);
%end;
%if%dde_file_yn(&outpath.\file2zip.py)=1%then%do;
x" %superq(outpath)\file2zip.py";
%end;
%putNOTE: The Python Code Will be Executed...;
run;
/*延迟结束SAS macro的执行,等待ZIP完全压缩完成*/
data _null_;
%if%dde_file_yn(&outpath.\St_Excute_temp.txt)=1%then%do;
%putNOTE: Please wait a little,The Python Code will be Excuted...;
options nonotes;
%end;
%do%until(%dde_file_yn(&outpath.\St_Excute_temp.txt)=);
%end;
%if%dde_file_yn(&outpath.\St_Excute_temp.py)=%then%do;
options notes;
%end;
run;
%mend;
/*
filepath:填写需要压缩的文件夹
outpath:填写压缩输出的路径
zipname:填写zip的名称
注意:filepathoutpath 不要填相当,为啥不要填一个路径,你可以自己测试一下测试的时候磁盘空间全占满了,不要怪我。
*/
%pyh_file2zip(filepath=A:\macro,outpath=A:\,zipname=Macros);
好了,把上面的都串联起来,就可以实现SAS运行完程序后,自动将结果生成压缩包,在将zip通过邮件自动的发出去。代码都可以直接用。
还有一个小编没有提到,如何把SAS弄成定时运行,一周运行一次,一个月运行一次,完全不用人在去操作,这个也是肯定能做到的。由于小编的数据并不是直接从SQL数据库里面拽出来的,也没有一定的规律,所有小编就没有研究。只要你敢想,很多事情是可以做到。
题外话:给大家科普一点知识:冬天到了,很多人会感冒,但是感冒怎么吃药都不管用,这是为什么呢?因为小小的感冒还分很多类型:风寒感冒,风热感冒,不要吃错了药喔!!!否则向小编这样,越吃药越有一种死神来了的感觉~
领取专属 10元无门槛券
私享最新 技术干货