首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SAS-Send email&Macro-Pyh

很久很久以前,有人问小编: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数据库里面拽出来的,也没有一定的规律,所有小编就没有研究。只要你敢想,很多事情是可以做到。

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171217G0DM6M00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券