前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS- Send email&&Macro-Pyh_file2zip

SAS- Send email&&Macro-Pyh_file2zip

作者头像
Setup
发布2019-10-21 17:16:15
7810
发布2019-10-21 17:16:15
举报

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAS程序分享号号号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档