SAS宏入门SAS宏的作用•获取SAS系统信息•有条件执行数据步和过程步•开发交互式系统•产生与数据无关的SAS程序•在不同的SAS数据步和过程步之间传递数据•重复执行SAS程序简介:•定义:可以按照用户的需要对SAS系统进行扩充和定义,以减轻在完成一些相同的统计分析任务时的文本录入量。•宏功能包括:宏处理器宏语言•两种定义符:&名字(宏变量标记)%名字(一段宏)简介:•对SAS程序书写的约定:用户录入的程序用小写字母,SAS系统看到的程序用大写字母,其中宏变量替代的部分用黑体字表示。•注意:有三个以%开头的SAS语句不是宏功能中的内容,它们是%INDUCE、%LIST、%RUN语句。主要内容:•1、宏变量•2、宏•3、宏应用实例•4、如何提高宏的运行效率一、宏变量1、1简介:•宏变量:SAS程序中通过替代符号动态地更改文本的工具;只包含字符型数据。具体长度是由赋值给它的文本决定的。值的最大长度为:32K字符•分类:用户定义的宏变量自动宏变量全局宏变量局部宏变量1、2SAS系统定义的宏变量•除了SYSPBUFF之外,所有的自动宏变量都是全局变量。•要使用自动宏变量,可以在&符号后跟上一个宏变量名。如:footnote”Reportfor&sysday,&sysdate”;•用户可以给具有读/写状态的自动宏变量赋值,但不能给只读状态的宏变量赋值。•使用%PUT_AUTOMATIC_,可以看到所有可以利用的自动宏变量。表22.1按类别划分的自动宏变量状态变量内容读/写SYSBUFFER来自于%INPUT的不匹配的文本SYSCCSAS对用户的操作环境返回的当前状态代码YSCMD来自于宏窗口命令行的最后一个不可识别的命令SYSDEVIC当前图形设备的名字SYSDMG反映对一个损坏的数据集采取的措施的返回代码SYSDSN最近使用的SAS数据集的两级名称SYSFILRCFILENAME语句设置的返回代码SYSLAST最近使用的SAS数据集的名称SYSLCKRCLOCK语句设置的返回代码SYSLIBRCLIBNAME语句设置的返回代码SYSMSG宏窗口显示的信息SYSPARMSYSPARM=系统选择项设定的值SYSPUBFF宏参数值的文本SYSRC各种与系统有关的返回代码表22.1按类别划分的自动宏变量(续表)状态变量内容只读SYSCHARWIDTH字符串宽度值SYSDATE表示当前SAS工作或运行期间日期的字符串(两年数份)SYSDATE9表示当前SAS工作或运行期间日期的字符串值(两年数份)SYSDAYSAS工作或运行期间的星期几SYSENV前景或背景荧光屏指示符SYSERRSAS过程或数据步设置的返回代码SYSINDEX目前工作期间已经执行的宏数SYSINFO返回代码信息SYSJOBID目前一批工作或用户ID的名称(随主机环境改变)SYSMENV当前宏运行的环境SYSPROCESSID当前SAS操作的IDSYSPROCESSNAME当前SAS操作的名称SYSSCP操作系统的缩写SYSSCPL操作系统的名称STSSITE分配给用户的地点的号码SYSSTARTID最后一个STARTSAS语句产生的ID表22.1按类别划分的自动宏变量(续表)状态变量内容SYSSTARTNAME最后一个STARTSAS语句产生的操作名称SYSTIME当前SAS工作或运行期间时间的字符串值SYSUSERID当前SAS操作的用户ID或注册号SYSVER所运行的SAS的版本号SYSVLONGSAS软件的版本号和维护等级1、3用户定义的宏变量(1)•定义宏变量方法:•宏变量名必须以字母和下划线开始,后面跟字母或数字。•可以给任意宏变量命名,只要这个名称不是保留字(见表22、2)。•建议不要使用AF、DMS、SQL、SYS等前缀,因为SAS软件常常把他们用在自动宏变量中。•可以使用%PUT_ALL_查看到所有用户创建的宏变量。表22.2宏功能中的保留字ABENDENDMETASYMSUBSTRABORTEVALNRBQUOTESUPERQACTFILENRQUOTESYSCALLACTIVATEGLOBALNRSTRSYSEVALFBQUOTEGOONSYSEXECBYGOTOOPENSYSFUNCCLEARIFPAUSESYSGETCLOSEINCPUTSYSRPUTCMSINCLUDEQSCANTHANCOMANDRINDEXQSUBSTTOCOPYINFILEQUOTETSODEACTINPUTQSYSFUNCUNQUOTEDELKEYDEFQUPCASEUNSTRDELETELENGTHRESOLVEUNTILDISPLAYLETRETURNUPCASEDMIDSPLYLISTRUNWHILEDMISPLITLISTMSAVEWINDOWDOLOCALSCANELSEMENDSTREDITMACROSTOP可以使用%PUT_ALL_查看到所有用户创建的宏变量。1、3用户定义的宏变量(2)——1、创建宏变量及对其赋值•最简单方法:使用宏程序语句%LET,其形式为:%LET宏变量名=宏变量值•其他:%DO循环语句;%GLOBAL语句;%INPUT语句;SQL中的SELECT语句的INTO语句;%LOCAL语句;%MACRO语句;SCL中的SYMPUT程序和SYMPUTN程序;%WINDOW语句。1、3用户定义的宏变量(3)——2、引用宏变量:在创建了一个宏变量之后,使用它的方法是在它的名字前加一个与符号(&变量名),这称为宏变量引用(macrovariablereference),这一引用通过对宏变量值的解析产生符号替代。要解析一个文本串中的宏变量引用,要把这个文本串用引号括起来,单引号的宏变量引用不被解析。比较下面两个TITLE语句的区别:•%letcity=shanghai•title1:“Dataof&city”;•title2:‘Dataof&city’;•SAS系统最后显示的标题分别是:•Dataofshanghai和Dataof&city◆用户可以根据需要在SAS程序中多次引用宏变量,宏变量,宏变量的值保持不变,直到用户改变它,例如:%letmmm=Newcity;Datatemp;Ifnum=800;run;procprint;title“SubsetofDataSet&mmm”;run;◆每次出现宏变量引用&MMM,宏处理器用Newcity替代它,所以SAS看到的语句是:DATATEMP;SETNEWCITY;IFNUM=800;RUN;PROCPRINT;TITLE“SubsetofDataSetNewcity”;RUN;注意:如果引用了有存在的宏变量,在SAS的log窗口会显示警告信息。◆有时需要将宏变量引用和前导文本或末尾文本合并起来(例如:DATA=PERSNL&YR.EMPLOYES,其中&YR包括了两位数的年份值)或和另一个宏变量引用合并起来(例如&MONTH&YR),这样可以使用户在几个地方使用相同的文本或反复使用一段程序,因为我们可以改变每一次的值。例如:%letmmm=bought;datanew&mmm;setsave.&mmm;moreSASstatementsifnum1000;run;SAS看到的语句是:DATAMEWBOUGHT;SETSAVE.BOUGHT;moreSASstatementsIFNUM1000;RUN;注意:宏变量引用不需要连接操作符,SAS系统会自动构造结果字符,这与数据步不一样。◆有时我们要在文本中对宏变量定界,看下面一段语句:%letmmm=bought;data&mmm1&mmm2;setin&mmm.temp;run;◆这时SAS并不会使用BOUGHT1和BOUGHT2两个数据集,而且给出错误信息。这是因为SAS把MMM1和MMM2当成了两个合法的宏变量名,而不是引用宏变量MMM。在这种情况下,我们要使用宏变量引用定界“.”,上面第二条语句正确的写法应该是:data&mmm.1&mmm.2;这时的SAS看到的语句是:DATABOUGHT1BOUGHT2;如果“.”是SAS的名字的一部分,要使用两个定界符,如下面两级数据集名的例子:setin&mmm..Temp;这时SAS看到的语句是:SETINBOUGHT.TEMP;注意:用户可以在任何宏变量引用后使用定界符,但只有在起界定作用或“.”是SAS的名字的一部分时,定界符才被解析,所以,下面两名语句在SAS来是等价的:title“&MMM.report”;title“&MMMreport”;它们都相当于:TITLE“bought”;1、3用户定义的宏变量(4)——3、显示宏变量的值•◆显示宏变量的值最简单的方法是使用%PUT语句,它将在•SAS的log窗口显示结果,如:•%letx=name;•%lety=weight;•%letz=height;•%put&x***&y***&z***;•log窗口会显示下列文本:•name***weight***height***◆系统选择SYSBOLGEN会显示对宏变量的解析。例如,宏变量PRGM和SITE的值分别为PRINTSASUSER.ROOM:optionssysbolgen;%lettitle=“%upcasw(&prgm)of%upcase(&site)”;在上面语句中,SYSBOLGEN选择项会在log窗口显示:SYMBOLGEN:MacrovariablePRGMresolvestoprint;SYMBOLGEN:MacroviaableSITEresolvestosaauser.room1、3用户定义的宏变量(5)——4、改变宏变量的值•如果想在SAS程序中改变宏变量的值,只要在该宏变量值•改变之前的语句中使用%LET语句对其重新赋值即可,例•如下面这段程序:•%leta=data1;%leta=data2;•datatemp;datatemp;•set&a;set&a;•ifsex=1;ifsex=1;•run;run;•procprint;procprint;•title“SubsetofDataSet&a”;title”SubsetofDataSet&a”;•run;run;SAS系统看到的程序为:DATATEMP;SETDATA1;IFSEX=1;RUN;PROCPRINT;TITLE“SUBSETOFDATASETDATA1“RUN;DATATEMP;SETDATA2;IFSEX=1;RUN;PROCPRINT;TITLE“SUBSETOFDATASETDATA2“RUN;1、3用户定义的宏变量(6)——5、间接引用宏变量•比较:•%put&city&n•%put&&city&n•原则:宏处理器从左到右把每两个&解析成一个&,然后再解析后面的内容,最后返回来解析整个宏变量引用。•例:%letvar=city;%letn=6;%put&&&var&n;◆使用间接引用引起可以通过一个%DO循环语句产生一系列宏变量引用,例如宏变量CITY1至CITY10包含的值为ShanghaiBeijingGuanzhou、Tianjin、Chongqing、Chengdu、WuhanKunming、Dalian和Nanjing,则下面的程序:%macrolistthem;%don=1%to10;&&city&n%end;%mendlistthem;%put%listthem;会在SAS的log窗口显示:ShanghaiBeijingGuangzhouTianjinChongqingChengduWuhanKumingDalianNanjing◆虽然使用两个以上的&比较罕见,但是用户应该记信住这样一条原则:宏处理器从左到右把每两个&解析成一个&,然后解析后面的内容,最后再返回来解析整个宏变量引用,例如下面一段语句:%letvar=city;%letn=6;%put&&&var&n;在第三句中,&&被解析成&,&VAR被解析成CITY,&N被解成千上万,这样&&&VAR&N就