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

Macro-Ods Excel Output

作者头像
Setup
发布2019-10-21 17:17:38
2K0
发布2019-10-21 17:17:38
举报
文章被收录于专栏:SAS程序分享号号号
本文是上一篇文章的续篇,在前面已经提到过DDE,Proc export ,ods tagsets.excelxp输出Excel的程序、Macro。正所谓重量级的都是最后出场,今天的ods Excel输出方式大概是小编近期最后一次写输出Excel的文章,并非小编将所有的输出Excel的方法都讲完了,也并非小编对Excel输出已经登峰造极了,因为小编目前研究所掌握的已经够用,如果在深入的研究可能也没有太大意义,大概这就是小编心中的“平衡,取舍”之道了。由于吸取昨天的教训,代码太长,排版太丑,那么“好”的程序阅读量好少哎,也没有吸粉成功,小编的“2017千粉计划”眼看就要泡汤了哎,只好退而求其次,给自己定下了“2018万粉计划”!新年将至,预祝诸位元旦快乐,同样也预祝自己:让“梦想“的“梦”不是“白日梦”的“梦”,好像有点难,没有难度哪有成就感呢~

1

ods excel的优势

1、输出文件较小

利用ods Excel输出的xlsx文件较小,怎么来形容其小呢,小编今天尝试了113个数据集(大概65M)利用ods excel输出到一个xlsx文件里面,文件大小只有586k.而利用tagsets.excelxp输出大小为10M。

2、输出样式可自定义

不管是DDE还是tagsets.excelxp均可以实现对样式的设计,但是DDE使用起来较为繁琐(也可能是小编对此方式研究不够透彻),ods Excel的输出样式可以自定义话,与tagsets一样,可以在Template里面设计。

3、兼容计算

利用ods excel输出,在其中可以添加proc report等各种过程步,或者进行统计分析的画图的过程步,也可以将图像进行输出到Excel,进行精确的控制(小编对图形的输出暂无研究,日后如有机会会研究的)。

4、输出数据format的值

在上述几种方式中,“好像”只有export不可以输出format的值,为啥加“好像”呢,话不能说太死了,回头就被打脸不太好,因为小编不会用export输出变量显示的format,也看见很多人不会,如果你会,请你告诉我吧,我的求知欲还是很强的。以前将别人输出的讲数据集用一个Macro将颜色一个新的变量将format put过去的方式(New=put(old,format)) 这样转化在输出,我觉得比较low(纯属个人观点,勿喷).

5、随心所欲添加索引

重要的都是最后说,这个索引其实就是亮点,几乎上面的所有的输出方式都能添加索引,建一个目录实现跳转过去,跳转回来,但是要随心所欲,小编还是觉得ods Excel是最方便的。而本文也主要介绍的是这个。说到索引,顺便将一下小编去研究Excel输出是为什么,其实为的就是解决这个索引、目录的问题,小编的日常工作中经常会输出Excel形式listing,很多Excel的sheet,当然小编不是自己看,为了让用户体验感更好,是每一个负责人的programmer不懈追求的事(力所能及)。如果有索引就能实现快速的跳转的某个sheet,再从每个sheet跳转回到目录。方便别人就是方便自己。下面会引用一个10秒小电影来直观感受一下ods Excel实现索引的效果。

小电影

视频内容

请原谅我的手机录像比较low,效果大概是这样的,这个是小编语法基本测试成功后录下的一个视觉效果,可以实现Excel的快速跳转,又可以点击sheet的一个第一行返回到contents.视频中的效果并不是小编写的Macro最终输出的效果,因为在将语法完善成Macro的过程中,小编觉得还可以做的更美观和加一些其他的信息。正如很多公司一样,有专门的programmer对Macro进行维护和更新,一个好的Macro可能经历了长达数年乃至10年的维护,参与维护的programmer当然也会有很多。时代在变,需求在变,拥有Macro并没有太大价值(唯一的价值在于学习知识,与参考),做一个会写Macro的人才是真正的价值。因此小编将全面揭秘这个本次Macro编写的过程~

最终效果

Note:本来是是截图的,但是发现在有一些个人信息,小编懒了,就直接用手机补拍故意曝光过曝一下,掩盖一些背景信息。

2

正文:ods Excel Macro

1

明确Macro的目的

小编在写每一个Macro之前,都会明确Macro的目的与功能。如果是过于复杂的Macro,小编会将这一个Macro拆分成很多部分,最后将各部分组装到一起,为什么这么做呢,因为这样修改起来,调试起来很方便,哪儿有问题就到那个程序里面去修改。而且拆分成各个小模块如果以后再写其他程序或者Macro的时候是可以直接调用的,其实有这几点好处就已经很有必要将一个复杂,或者涉及知识点较多的Macro给拆分在组装。说到这儿就要说我们这些”码农”的本质了(SAS programmer 虽然并非IT行业的程序员,但是毕竟也是写代码,自称一下“码农”应该一点也不为过),写程序的本质其实就类似于SAS语言是一个比较强大的工厂(可以炼铁,也可以造汽车),我们就是工厂里面的工人,需要将各个零件组装成汽车,如果没有零件,我们就去造~

小编近2月写过或者更新过的Macro

NOTE:由上,可以见小编将很多Macro都拆分来写(如:rtf的输出,将截图有4个以rtf_开始的程序,在如dde,tag等),本次的ods excel的Macro也不例外,见上图是以exl_开头的程序均为本次的相关的Macro。

看到这些Macro你有想要的冲动么?要也不给

,你关注了小编的公众号了么,你将小编推荐给你学习研究SAS的朋友们了么,如果都有,你还应该反思一下,你打赏了文章了么,如果你打赏了,你还应该反思一下打赏的够不够

开玩笑的哎,如果有需要可以私下联系我哎,可能不会给你,但是会给你写的建议,不能再装逼了,其实小编写的Macro不多,也就这几个,小编也不是大神,也只能是互相交流互相学习。(期待有一天小编的Macro数据能过百

2

养成写注释的习惯

%exl_rep_ds注释部分

通过这张截图,就可以看出小编写的Macro是怎么使用的,宏参数有哪些,各个参数是干嘛用的,以及创建人等等一些描述性的东西,很容易让人看懂这个宏是功能,和版本。也建议大家养成一个类似的习惯,良好的编程习惯是对自己很有帮助的,因为每天都有大量的程序要写,可能你写的程序,你1个星期后能记得,1个月后能记得,但是半年后呢,一年后呢...因此注释很重要。小编的记忆和鱼类似,虽然不似鱼只有7秒,但是超过2周以上的程序健忘率高达50%,不记得当时为什么要那样写,不记得那样写的目的等等,都要想很久才能想起来或者根本想不起来,因此注释很重要~

%exl_sas2xls

NOTE:Macro的前面的说明,可以在程序写完后在写,但是参数的说明,还是建议在编写程序的时候就编写。Macro的宏参数,一般在写程序前会大致设计几个,然后在写的过程中不断完善,或者觉得没有必要可以删减,也可以设置参数的默认值。如这个,我就给几个宏参数设计了默认值(flag,contents_index)

3

定框架便于测试和调试

如果有人说,他的Macro是一气呵成写的,不用测试与调试,那么我是真的相当的佩服他的自信,如果哪一天小编能过做到这样,那么大概小编就得到成仙了~(关于想知道Macro调试的知识,请关注我的公众号后点击,进入公众号点击history,找到SAS-Macro编写调试....小编就不在这里说了)

定框架的前提是你有一定知识储备,这个知识储备就是,你大概要知道ods excel输出Excel的基本结构。和输出相关的option选项。如果你之前不懂相关的知识,就说 我想写一个什么什么功能的Macro,这样也不是不可以,但是你写之前肯定是要做功课将你需要用到的知识点弄懂,巧妇难为无米之炊就说这个道理。

小编的基本框架

小编的基本框架如上截图:很类似之前的tagsets的写法(如果看了我前面的一篇推送就会发现),我是先回tagsets.excelxp的,在此基础上在来学习ods Excel的,还是回到基本框架上来,小编写Macro基本上都这样的,先由外到里,在由里到外,最后Macro就会基本定型。我们可以发现控制ods excel输出其实是中间的proc report过程步,利用ods excel options(sheet_name=)来定义输出的sheet名称。由此小编就开始写proc report过程步的那个Macro,也就是%exl_rep_ds这个Macro。

Macro参数

前1/3部分代码

这个部分没啥好说的,看截图,注释横明确的的。好吧,还是多说几句,(%local :定义局部宏变量,只作用在当前Macro,%global:是定义全局宏变量,不能说是定义,应该用“申明”更加准备一些)本来还想说一下其他的宏函数,想一想还是不说了

第2/3部分代码

Proc report过程步: 为什么%if判断一下数据集是否有观测,如果用过report的同行,应该会知道如果report输出的数据集是空的,那么会是一片空白的存在,不太美观和好看。

这里重点来了!!!看截图,compute before _page_/里面的Url的设置,这里实现一个功能,那就是点击每个sheet的第一行的第一句话“click here ti return the contents”就会跳转到某一个sheet,为什么是某一个sheet呢,因为这里我用的Macro Var来代替的,如果改变宏参数的值,那么跳转到哪儿的sheet会随着变化,当然此处我是要跳转到第一个sheet,第一个目录的sheet.

后3/3部分代码

最后部分的代码,针对空数据进行处理,会插入一条记录,这里插入用的是proc sql的方法。在define的时候最后用noprint来不显示这个衍生变量。

4

组装

上面的report的Macro就这么简单的结束了,其实看起来简单,然则并不简单,如果对report不够了解,写起来也有些吃力。当然小编其实不太了解,了解的只是部分。官网一个report就可以写一本书,一个ods就可以写N本书。足见SAS的强大,经常在一些群里面看到别人吐槽SAS,其实吧,任何语言都只是工具,严格没有好坏之分,只有你喜不喜欢和感不感兴趣之分,小编是SAS的死粉,因为小编是靠SAS吃饭的人的。说多了,纯属个人观点。

%exl_sas2xls

第1/N部分

小编太懒了,就不去算N的值呢~如果你有兴趣,请留言告诉我N的值是多少~

这里有个语法:%do %while语法,真的很建议大家研究学习一下, %do %until语法 ,%do %to 语法, 建议大家都看看,小编的历史推送中的代码这些都有用到,分散的有点散,有兴趣可以找一找。这儿可以获取数据集名称以及sheet名称等等和循环次数。

第2/N部分

这一步其实就是为了做目录索引的,做目录索引的原理,其实就是一个数据输出在第一个sheet,然后添加URL实现跳转,大家千万不要被option里面的contents选项误导,小编就被这个option选项误导,浪费了大量时间研究,最终总结得出,contents选项很垃圾,不能让我随心所欲。

第3/N部分

这个截图里面的proc sql 是利用SAS数据集字典获取Table(你要输出的数据集中的观测数),另外也是定义ods 的输出路径和一些option选项

第4/N部分

这部分就是实现了目录和索引的功能。实现的方法其实和前面实现跳转会到某个sheet的方法是一样的。

第5/N部分

这个时候就用到了之前的report的宏,用了循环。着就是组装,Macro中调用Macro。

3

小编的辛酸史

小编写这个Macro遇到的最大问题就是实现跳转,前期被contents误导,后来猜出可以用一个数据实现跳转,这个时候又被一个计算的option函数误导,研究好久没有找到一个好的解决途径~最后不断的逛百度还是没有解决问题,知道进入了SAS官网的论坛,我才发现了新大陆~一个学习的全新方式,我真的不得不佩服国外的SAS编程水平之高,完全不是和国能在一个level上,看下面的截图。

这个论坛推荐给大家。当然关注我的公众号和逛论坛是一样有价值的

4

相关资料介绍

小编在学习过程中收集了大量书籍和资料。给大家截个图,如果有需要可以联系我,也可以关注公众后回复:exl即可获得程序代码等等等~等你消息喔~

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档