Macro系列导读
SAS Macro作为SAS高手不可或缺的一项技能,是因为它功能足够强大,能极大的提升程序开发效率;使你的时间和精力投入在更有价值的事情上。
Macro系列文章,将会逐一奉上SAS Macro的点点滴滴,带你踏上从认识Macro到熟练使用Macro之路。掌握SAS Macro,将会使你的SAS编程能力更上一层楼。
上
期
上期文章“Macro Variables(1)”对Macro Variables的进行了整体的介绍。由两大类构成:Automatic Macro Variables和User-Defined Macro Variables;阐述了它们之间的异同点。针对User-Defined Macro Variables,介绍了常用的定义方法、使用,及删除的操作。
回
顾
Macro系列(5)—Macro Variable(2)
本期文章对Macro Variable的存储方式进行大致介绍,重点对Macro Variables的间接引用方式进行详细阐述,此种方式在数据处理中特别常用,其功能也比较强大。
Macro Variables存储
在上期文章中说到Macro Variables和Data Step中的Variables是没有任何关系的,后者是来自于Data Set,或者其他数据源;那么前者又是来自哪里的?
其实Macro Variables也是类似的存储方式,是存储在“Symbol Table”中。它是由Macro Processor在SAS启动时自动创建并维护的。SAS提供了一张视图来供我们查看Symbol Table中的内容,其位于SASHELP逻辑库下:“SASHELP.VMACRO”,如下所示:
小拓展
对于User-Defined Macro Variables来说,可根据其使用范围(Scope)分为两种:Global、Local。
其中Global Macro Variables是可以在任何地方使用;
而Local Macro Variables是和Macro Program紧密联系的,只能在当前的Macro Program中使用。
相对应的,Symbol Table也分为Global Symbol Table、Local Symbol Table(Automatic Macro Variables中了除了SYSPBUFF,都属于Global)。
间接引用Macro Variable
一般情况下,我们通过“&”来引用一个Macro Variable,例如:“&SYSDATE”。称之为“直接引用”。那么什么叫做“间接引用”呢?
就是通过一个Macro Variable得到另外一个Macro Variable的值。先来看一个例子:
%let a=b;
%let b=John;
此处创建了两个Macro Variables:a和b。其中a的值是“b”,b的值是“John”。如果想要在程序中使用“John”这个值,那么可以直接通过b来获取。例如:
不同语言中,单引号与双引号有不同的用处。在SAS中,单引号和双引号都是表示字符串,在不用Macro的时候是没有任何区别的。针对Macro,只有一个区别:“单引号中的Macro Trigger不会启动Macro Processor,相当于普通字符;而双引号中的会启动Macro Processor”。
如果想通过a来得到“John”这个值,有没有办法得到呢?
没错,是可以的。这就是间接引用,通过一个Macro Variable得到另外一个Macro Variable的取值。
间接引用的三种类型
一个Macro Variable的取值是另外一个Macro Variable的名字;
一个Macro Variable的取值是另外一个Macro Variable名字的前半部分;
一个Macro Variable的取值是另外一个Macro Variable名字的后半部分;
下面通过实例一一进行说明:
一个Macro Variable的取值是另外一个Macro Variable的名字
二
一个Macro Variable的取值是另外一个Macro Variable名字的前半部分
特别注意
a与person之间有一个小数点“.”。如果没有这个小数点,会把aperson当做一个Macro Variable。但实际上是没有这个Macro Variable的,这个“.”就是为了将Macro Variable Name与其他字符区分开来。
三
一个Macro Variable的取值是另外一个Macro Variable名字的后半部分
看完这三种类型的间接引用,或许会把你看得一脸懵。有些地方是“&&”,有些地方是“&&&”,还有些地方有“.”,到底是什么意思?
原理阐述
对于含有多个“&”的间接引用方式,Macro Processor会进行多次解析,得到最终的结果。下面对解析过程进行剖析,将每一步的过程都展示出来,各位肯定就清楚了。
首先需要记住三点:
如果解析过程中遇到连续的两个“&&”会把它解析为一个“&”;
如果解析完的结果中还有“&”,会触发第二次解析;
如果解析过程中遇到“.”,当做分隔符处理,其不会出现在解析结果中;
来看这段程序:
能否理解这个结果?
如果不理解,看完下面这张彩图,保证你豁然开朗:
基于张图详细解析图,结合前面说到的三个要点,相信各位就会基本明白是怎么回事了。不管有多少个“&”,只要一层层去分析,就知道最终结果会是什么了。
下面看看前面提到的三种间接引用类型的具体解析过程(注意,第二种方式中的小数点,在第一次解析完成之后就不存在了):
小拓展
你或许会发现上面这些间接引用好像都是两层的,有没有更多层级的引用?
不用怀疑,绝对有。想要多少层都可以,只需要加“&”就可以。这么高深的用法,就等着你们去探索了。
本期文章到这就结束了,对存储Macro Variables的Symbol Table进行了介绍;对Global和Local进行大致描述,具体细节后文阐述。重点对Macro Variables的间接引用方式进行详细的说明,这种间接引用方式在封装一些功能的时候经常会用到。等下期文章介绍完Macro Program后,会有实际的案例进行说明。更多内容,请持续关注SAS中文论坛——“SAS岩论-Macro系列”。
作者:辛岩,从事了多年的SAS数据分析挖掘工作,担任过项目经理、技术顾问、培训讲师等职务,拥有丰富的项目实战经验。
联系客服