第10章SAS宏功能10.1概述SAS系统的MACRO处理器可以让程序更简洁更明了及更容易维护,帮助用户在使用SAS系统时更方便更自动化,具体来说,它具有以下功能:1.获取SAS的系统信息;2.有条件地执行数据步和过程步;3.开发交互式系统;4.在不同的数据步和过程步之间传递数据;5.重复执行SAS代码等等。.SAS宏语言的管理1.MACRO变量2.MACRO程序语句3.MACRO表达式和函数10.2SAS宏变量的使用与定义宏变量(有时也称符号变量)属于SAS宏语言的范畴,和数据步中的变量的概念是不一样的。除了数据行外,你可以在SAS程序的任何地方定义和使用宏变量。数据步变量是和数据集相联系的,而宏变量是独立于数据集的。数据集变量的值取决于正在处理的观测,而一个宏变量的值总是不变,直到被明确改变。宏变量类似于一般变量的命名方法。程序中以&宏名来引用MACRO变量(有时为了清晰起见,也可以通过&宏名.来引用MACRO变量)SAS宏变量共有两种:1.系统宏变量2.用户自定义的宏变量。10.2.1系统宏变量一些系统宏变量01/*Program_10-l-l.sas*/02DATA_NULL_;03PUT'SYSDATE='&SYSDATE;/*执行时的日期*/04PUT'SYSDAY='&SYSDAY;/*执行时是星期几*/05PUT'SYSENV='&SYSENV;/*交互模式或批次模式*/06PUT'SYSSCP='&SYSSCP;/*返回正在用的操作系统*/07PUT'SYSJOBID='&SYSJOBID;/*程序的操作执行代码*/08PUT'SYSERR='&SYSERR;/*程序执行的错误码*/09PUT'SYSRC='&SYSRC;/*程序执行的回复码*/10PUT'SYSLIBRC='&SYSLIBRC;/*使用LIBNAME时设置是否正确*/11PUT'SYSFILRC='&SYSFILRC;/*使用FILENAME时设置是否正确*/12RUN;使用宏语句%put_automatic_;可以查看所有的系统宏变量,结果显示在LOG窗口。SYSDATE=20OCT08SYSDAY=WednesdaySYSENV=FORESYSSCP=WINSYSJOBID=384SYSERR=0SYSRC=0SYSLIBRC=0SYSFILRC=0NOTE:DATAstatementused:realtime0.03secondscputime0.01seconds10.2.2用户自定义宏变量定义方法及其使用:%LETmac_var=取值等号左边是宏名.定义好的MACRO变量可以在不同的SAS数据步或过程步中重复使用,该MACRO变量的值不会改变.引用时直接用&宏名.即可.宏变量定义可以放在程序的任何位置,但在使用之前一定要定义好.例1等号右边可以是数值或字符串表达式,字符串用引号括起来.字符串前后的空格赋值前被删除。01/*Programs10-2-l.sas*/02%LETmm=07;03DATAoutl;04FORMATvar_aYYMMDD10.;05INPUTvar_a:YYMMDD6.;06IFmonth(var_a)=&mm;07DATALINES;08010203090107211001032211010723120101031301040214;16PROCPRINT;17TITLE数据月份:&mm;18RUN;注:这里的标题必须用双引号括起来,而不能用单引号,因为宏处理器只对双引号中引用的宏变量进行这种处理,而把单引号中的所有字符都看作是标题的内容。结果:数据月份:0707:57Wednesday,October20,20082Obsvar_a12001-07-2122001-07-23注:如果要查看用户自定义的宏变量,可以提交语句%put_USER_;如果要查看所有宏变量,可以提交语句%put_ALL_;可将SAS的一段程序设为MACRO变量例2一个宏变量代表一行语句时01/*Program_10-2-3.Sas*/02%LETmm=INPUTvar_a:YYMMDD6.;03DATAoutl;04FORMATvar_aYYMMDD10.;05&mm;06DATALINES;07010203080107210901032210010723110101031201040213;14RUN;一些宏函数1)宏函数%str例3一个宏变量代表多行语句时,可用宏函数%str来实现01/*Program_10-2-3_2.sas*/02DATAout1;03INPUTIncomeAge;04DATALINEs;051500230626003507200028083000300918001910;11run;12%letdsn=out1;13%letyvar=Income;14%letxvar=Age;15%letplot=%str(Procplot;plot&yvar*&xvar;run;);/*宏变量也可以嵌套引用*/16DATAtemp;17set&dsn;18ifAge=20;19&plot;20Procprint;21Titlesubsetof&dsn;22run;SAS数据步有关的一些宏函数2)宏函数%EVAL:当表达式中数字为整数时,把表达式转化为具体数值赋给宏变量。如果表达式中数字不是整数,使用函数%sysevalf(表达式)。例4%letm1=10/2;dataaaa;x=&m1;procprint;run;这种情况下,赋值运算使宏变量的值直接进行转化。但如果不是赋值语句,则必须使用宏函数例5%letm1=10/2;%letm2=10.5/3;%letc1=%eval(10/2);%letc2=%eval(10.5/3);%letc3=%sysevalf(10.5/3);%put&m1&m2&c1&c2&c3;Log窗口ERROR:Acharacteroperandwasfoundinthe%EVALfunctionor%IFconditionwhereanumericoperandisrequired.Theconditionwas:10.5/3359%letc3=%sysevalf(10.5/3);360%put&m1&m2&c1&c2&c3;10/210.5/353.52)宏函数%SYSFUNC(数据步函数名(自变量),输出格式)功能:将数据步的函数值传递给宏变量。例6%letmm=sqrt(3+2);%letss='a3';dataaa;x=&mm;y=&ss;run;结果:Obsxy12.23607a3这种情况下,赋值运算使宏变量的值直接进行转化。但如果不是赋值语句,则必须使用宏函数%letmm=datetime();%letm2=%sysfunc(datetime(),datetime20.);title&mm;title2&m2;title3%sysfunc(datetime(),datetime20.);%put&mm&m2%sysfunc(datetime(),datetime20.);dataa;x=&mm;y=%sysfunc(today(),yymmdd6.);procprint;formatxdatetime20.;run;100%put&mm&m2%sysfunc(datetime(),datetime20.);datetime()20OCT1993:10:38:0620OCT1993:10:38:06datetime()07:57Wednesday,October20,2008420OCT1993:10:38:0620OCT1993:10:38:06Obsxy120OCT1993:10:38:069310203)函数CALLSYMPUT用法:CALLSYMPUT(’宏变量名’,变量或表达式)功能:在数据步中,把一些变量或计算结果赋给宏变量。datateam1;inputposition:$8.player:$12.;callsymput(position,player);datalines;shortstpAnnpitcherTomfrstbaseBill;procprint;run;datac;inputholidaymmddyy.;callsymput('holdate',trim(left(put(holiday,worddate.))));datalines;070497;run;procprint;run;%put&holdate;函数SYMGET用法:SYMGET(’宏变量名’)功能:在数据步中,调用已经定义好的宏变量。datab;x=symget('holdate');procprint;run;%LENGTH%UPCASE%SUBSTR%SCAN详见p525SQL过程中定义宏变量的方法PROCSQL;Select变量1,变量2,……INTO:宏变量1,:宏变量2,……FROM数据集;dataa;inputab@@;datalines;12345678;run;procsqlnoprint;selecta,b,mean(a)ascinto:x1-:x4,:y1-:y4,:zfroma;%letm=&z;%put&x1&x2&x3&x4&y1&z;10.3宏程序宏程序就是存贮的1个文本,最简单的宏程序工作起来很象1个宏变量,但是复杂的宏程序可以做许多宏变量无法完成的事。对简单的文本代换,用宏变量效率高;但是当任务比较复杂的时侯,宏程序就要优越得多了,当某部分的SAS程序是经常重复使用时,便可通过宏程序的方式来简化编程.10.3.1.简单定义及引用语法及调用:%MACRO宏程序名;语句;%MEND;(或%MEND宏程序名;)调用:%程序名这一行语句可出现在SAS程序的任何位置,除了数据行.注:宏程序定义中不能出现数据行、datalines等。宏程序提交之后,编译过的宏存放在work.sasmacr中。一些保留词不能用作宏名,详见P537。例101/*Programs_10-3-l.sas*/02%MACROmac_pgm;03PROCFREQ;04TABLEvar_a;05RUN;06PROCPRINT;07RUN;08%MEND;09DATAout1;10INPUTvar_a$@@;11DATALINES;1212332134122114351211523312163334517;18%mac_pgm19DATAout2;20INPUTvar_a$@@;21DATALINES;2231121232113324215322545451263131227;28%mac_pgm例2宏变量与宏程序可结合使用01*Program_10-3-1_2.sas*/02%letdsn=out1;03%letyvar=Income;04%letxvar=Age;05%macroplot;06Procplot;07plot&yvar*&xvar;08run;09%mend;10DATAout1;11INPUTIncomeAge;12DATALINEs;131500231426003515200028163000301718001918;19run;20DATAtemp;21set&dsn;22ifAge=20;23%plot24Procprint;25Titlesubsetof&dsn;26run;在程序宏中,由“%*”开始的语句是宏注释语句,或/**/括起来的语句也是宏注释语句,一般建议使用后者。它们用于对宏内做的事情作注解。当宏较长的时侯,是很必要的。当你定义完这些宏后,就可以通过调用宏来运行程序。10.3.2含参数的宏程序带定位参数的宏程序语法及调用:%MACRO宏程序名(参数1,参数2,。。。);语句;%MEND;(或%MEND宏程序名;)宏程序名后面还可以加入多个宏参数,参数即定义了宏变量.例301/*Programs_10-3-2.sas*/02%MAC