SAS- Send email&&Macro-Pyh_file2zip

2019-10-21 17:16:15 浏览数 (1)

很久很久以前,有人问小编:SAS如何实现发邮件的功能,小编尴尬的反问道:SAS居然还能发邮件?是的,SAS可以实现发邮件的功能。以前觉得这个功能好鸡肋,现在小编变赖了,想将一切都交个SAS去实现半自动化乃至全自动化。在运行完SAS程序后,自动将产生的结果发给指定的人。

适用场景:SAS 程序已经调试并测试完成,无bug。如果程序有漏洞,在你执行完后,将有错误的结果对外发送了,那你就尴尬了。

比较适合向小编这种对自己的程序有充分的“自信”的人。。

更适合向小编这样自吹自擂天下一绝的人群。。

code

01

Options

设置邮箱

options emailsys=SMTP;

options emailauthprotocol=LOGIN;

options emailhost="smtp.126.com";/*设置邮箱*/

options emailid="xxxx@126.com";/*设置邮箱账号*/

options emailpw="xxxx";/*设置邮箱密码*/

options emailport=25;

NOTE:小编这里用的126邮箱,163等邮箱都是类似的。但是QQ邮箱是不信的,QQ非企业邮箱为啥不行,小编也不知道,腾讯的企业邮箱是可以的,小编公司的邮箱是腾讯企业邮箱。

optionsemailsys=SMTP;

options emailauthprotocol=LOGIN;

options emailhost="smtp.exmail.qq.com";

options emailid="xxxxx@xxx.com";

options emailpw="xxxx";

options emailport=25;

02

Send

all

Filename mymail email"xxx@xxx.com";/*发邮件的账号*/

data_null_;

file mymail to=("xxxx@qq.com" “xxx@126.com”) /*收件人*/

cc=("xxxx@qq.com" “xxx@163.com”) /*抄送人*/

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;

filename mymail clear;

看完是不是发现简单,恩,确实很简单的。但是有没有发现我添加的附件的.zip文件。压缩包的好处有多个,可以节约上传时间。也避免多个附件重复添加的繁琐。那么问题来了,SAS输出的报表,还是要人工去压缩打包成压缩包啊,并没有实现全自动化啊。不,SAS可以把文件夹,文件打包。SAS语言虽然不可以(小编目前见识短浅暂时还没有发现SAS语言有这个功能,如有大神知道,还请留言相关,万谢!),但是我们可以在SAS中借用第三方语言,如Python语言。然后在通过SAS调用Python语言去实现该功能。

Python:将文件夹压缩成zip Code(此代码通过SAS生成)

代码

1.先引入一个辅助Macro,检查一个文件是否存在

%macro dde_file_yn(myfilerf);

%local _Localhave;

%if%sysfunc(fileexist(&myfilerf))%then%do;

%put NOTE:The external file &myfilerfdoes exist.;

%let _Localhave=1;

%end;

%else%do;

%put NOTE:The external file &myfilerfdoes not exist.;

%let _Localhave=0;

%end;

&_Localhave.

%mend dde_file_yn;

2.sas生成zip文件(本质Python生成zip)

%macro pyh_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 "if os.path.exists(r'&outpath.&zipname..zip'):os.remove(r'&outpath.&zipname..zip')";

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.write(os.path.join(dirpath, filename))";

put "z.close()";

put "if os.path.exists(r'&outpath.St_Excute_temp.txt'):os.remove(r'&outpath.St_Excute_temp.txt')";

run;

data _null_;

%if %dde_file_yn(&outpath.file2zip.py)=0 %then %do;

%put NOTE: 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;

%put NOTE: The Python Code Will be Executed...;

run;

/*延迟结束SAS macro的执行,等待ZIP完全压缩完成*/

data _null_;

%if %dde_file_yn(&outpath.St_Excute_temp.txt)=1 %then %do;

%put NOTE: Please wait a little,The Python Code will be Excuted...;

options nonotes;

%end;

%do %until (%dde_file_yn(&outpath.St_Excute_temp.txt)=0);

%end;

%if %dde_file_yn(&outpath.St_Excute_temp.py)=0 %then %do;

options notes;

x "del &outpath.file2zip.py";

%end;

run;

%mend;

/*

filepath:填写需要压缩的文件夹

outpath:填写压缩输出的路径

zipname:填写zip的名称

注意:filepath outpath 不要填相当,为啥不要填一个路径,你可以自己测试一下

测试的时候磁盘空间全占满了,不要怪我。

*/

%pyh_file2zip(filepath=A:macro,outpath=A:,zipname=Macros);

好了,把上面的都串联起来,就可以实现SAS运行完程序后,自动将结果生成压缩包,在将zip通过邮件自动的发出去。代码都可以直接用。

还有一个小编没有提到,如何把SAS弄成定时运行,一周运行一次,一个月运行一次,完全不用人在去操作,这个也是肯定能做到的。由于小编的数据并不是直接从SQL数据库里面拽出来的,也没有一定的规律,所有小编就没有研究。只要你敢想,很多事情是可以做到。

题外话:给大家科普一点知识:冬天到了,很多人会感冒,但是感冒怎么吃药都不管用,这是为什么呢?因为小小的感冒还分很多类型:风寒感冒,风热感冒,不要吃错了药喔!!!否则向小编这样,越吃药越有一种死神来了的感觉~

0 人点赞