第10章 SAS宏功能.doc_第1页
第10章 SAS宏功能.doc_第2页
第10章 SAS宏功能.doc_第3页
第10章 SAS宏功能.doc_第4页
第10章 SAS宏功能.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章 SAS宏功能10.1 概述SAS系统的MACRO处理器可以让程序更简洁更明了及更容易维护,帮助用户在使用SAS系统时更方便更自动化,具体来说,它具有以下功能:1 获取SAS的系统信息;2 有条件地执行数据步和过程步;3 开发交互式系统;4 在不同的数据步和过程步之间传递数据;5 重复执行SAS代码等等。.SAS宏语言的管理1 MACRO变量2 MACRO程序语句3 MACRO表达式和函数10.2 SAS宏变量的使用与定义宏变量(有时也称符号变量)属于SAS宏语言的范畴,和数据步中的变量的概念是不一样的。除了数据行外,你可以在SAS程序的任何地方定义和使用宏变量。数据步变量是和数据集相联系的,而宏变量是独立于数据集的。数据集变量的值取决于正在处理的观测,而一个宏变量的值总是不变,直到被明确改变。宏变量类似于一般变量的命名方法。程序中以 &宏名 来引用MACRO变量(有时为了清晰起见,也可以通过 &宏名. 来引用MACRO变量)SAS宏变量共有两种:1 系统宏变量2 用户自定义的宏变量。10.2.1 系统宏变量一些系统宏变量01 /* Program_10-l-l.sas */02 DATA _NULL_;03 PUT SYSDATE= &SYSDATE; /* 执行时的日期 */04 PUT SYSDAY=&SYSDAY; /* 执行时是星期几 */05 PUT SYSENV=&SYSENV; /* 交互模式或批次模式 */06 PUT SYSSCP=&SYSSCP; /* 返回正在用的操作系统 */07 PUT SYSJOBID = &SYSJOBID; /* 程序的操作执行代码 */08 PUT SYSERR=&SYSERR; /* 程序执行的错误码 */09 PUT SYSRC=&SYSRC; /*程序执行的回复码 */10 PUT SYSLIBRC=&SYSLIBRC; /* 使用LIBNAME时设置是否正确 */11 PUT SYSFILRC=&SYSFILRC; /*使用FILENAME时设置是否正确*/12 RUN;使用宏语句 %put _automatic_; 可以查看所有的系统宏变量,结果显示在LOG窗口。SYSDATE=20OCT08SYSDAY=WednesdaySYSENV=FORESYSSCP=WINSYSJOBID = 384SYSERR=0SYSRC=0SYSLIBRC=0SYSFILRC=0NOTE: DATA statement used: real time 0.03 seconds cpu time 0.01 seconds10.2.2 用户自定义宏变量等号右边可以是数值或字符串表达式,字符串用引号括起来.字符串前后的空格赋值前被删除。定义方法及其使用:%LET mac_var=取值 等号左边是宏名.定义好的MACRO变量可以在不同的SAS数据步或过程步中重复使用,该MACRO变量的值不会改变. 引用时直接用&宏名. 即可. 宏变量定义可以放在程序的任何位置,但在使用之前一定要定义好.例1 01 /* Programs10-2-l.sas */02 %LET mm=07;03 DATA outl;04 FORMAT var_a YYMMDD10.;05 INPUT var_a :YYMMDD6.;06 IF month(var_a)= &mm;07 DATALINES;08 01020309 01072110 01032211 01072312 01010313 01040214 ;16 PROC PRINT;17 TITLE 数据月份:&mm;18 RUN;注:这里的标题必须用双引号括起来,而不能用单引号,因为宏处理器只对双引号中引用的宏变量进行这种处理,而把单引号中的所有字符都看作是标题的内容。 结果:数据月份:07 07:57 Wednesday, October 20, 2008 2 Obs var_a 1 2001-07-21 2 2001-07-23注:如果要查看用户自定义的宏变量,可以提交语句%put _USER_;如果要查看所有宏变量,可以提交语句%put _ALL_;可将SAS的一段程序设为MACRO变量例2 一个宏变量代表一行语句时01 /* Program_10-2-3.Sas */02 %LET mm = INPUT var_a :YYMMDD6.;03 DATA outl;04 FORMAT var_a YYMMDD10.;05 &mm;06 DATALINES;07 01020308 01072109 01032210 01072311 01010312 01040213 ;14 RUN ;一些宏函数1)宏函数%str例3 一个宏变量代表多行语句时,可用宏函数%str来实现01 /* Program_10-2-3_2.sas */02 DATA out1; 03 INPUT Income Age; 04 DATALINEs; 05 1500 23 06 2600 35 07 2000 28 08 3000 30 09 1800 19 10 ; 11 run; 12 %let dsn=out1;13 %let yvar=Income;14 %let xvar=Age;15 %let plot=%str(Proc plot;plot &yvar*&xvar;run;); /*宏变量也可以嵌套引用*/16 DATA temp;17 set &dsn;18 if Age=20;19 &plot;20 Proc print;21 Title subsetof &dsn;22 run;SAS数据步有关的一些宏函数2)宏函数%EVAL:当表达式中数字为整数时,把表达式转化为具体数值赋给宏变量。如果表达式中数字不是整数,使用函数%sysevalf(表达式)。例4%let m1=10/2;data aaa; x=&m1; proc print; run;这种情况下,赋值运算使宏变量的值直接进行转化。但如果不是赋值语句,则必须使用宏函数例5%let m1=10/2;%let m2=10.5/3;%let c1=%eval(10/2);%let c2=%eval(10.5/3);%let c3=%sysevalf(10.5/3); %put &m1 &m2 &c1 &c2 &c3;Log窗口ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:10.5/3359 %let c3=%sysevalf(10.5/3);360 %put &m1 &m2 &c1 &c2 &c3;10/2 10.5/3 5 3.52)宏函数%SYSFUNC(数据步函数名(自变量),)功能:将数据步的函数值传递给宏变量。例6%let mm=sqrt(3+2);%let ss= a3 ;data aa;x=&mm;y=&ss;run;结果: Obs x y 1 2.23607 a3这种情况下,赋值运算使宏变量的值直接进行转化。但如果不是赋值语句,则必须使用宏函数%let mm=datetime();%let m2=%sysfunc(datetime(),datetime20.);title &mm;title2 &m2;title3 %sysfunc(datetime(),datetime20.);%put &mm &m2 %sysfunc(datetime(),datetime20.);data a;x=&mm;y=%sysfunc(today(),yymmdd6.);proc print;format x datetime20.;run;100 %put &mm &m2 %sysfunc(datetime(),datetime20.);datetime() 20OCT1993:10:38:06 20OCT1993:10:38:06datetime() 07:57 Wednesday, October 20, 2008 4 20OCT1993:10:38:06 20OCT1993:10:38:06 Obs x y 1 20OCT1993:10:38:06 9310203)函数CALL SYMPUT用法:SYMPUT(宏变量名,变量或表达式)功能:在数据步中,把一些变量或计算结果赋给宏变量。data team1;input position : $8. player : $12.;call symput (position,player);datalines;shortstp Annpitcher Tomfrstbase Bill;proc print;run;data c;input holiday mmddyy.;call symput(holdate,trim(left(put(holiday,worddate.);datalines;070497;run;proc print;run;%put &holdate;函数SYMGET用法: SYMGET(宏变量名)功能:在数据步中,调用已经定义好的宏变量。data b;x=symget(holdate);proc print;run;%LENGTH%UPCASE%SUBSTR%SCAN详见p525SQL过程中定义宏变量的方法PROC SQL;Select 变量1,变量2,INTO :宏变量1,:宏变量2,FROM 数据集;data a; input a b; datalines; 1 2 3 4 5 6 7 8 ;run;proc sql noprint; select a,b,mean(a) as c into :x1-:x4,:y1-:y4,:z from a;%let m=&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 %MACRO mac_pgm ;03 PROC FREQ;04 TABLE var_a;05 RUN ;06 PROC PRINT;07 RUN;08 %MEND;09 DATA out1;10 INPUT var_a$ ;11 DATALINES;12 1 2 3 3 213 4 1 2 2 114 3 5 1 2 115 2 3 3 1 216 3 3 3 4 517 ;18 %mac_pgm19 DATA out2;20 INPUT var_a$ ;21 DATALINES;22 3 1 1 2 123 2 1 1 3 324 2 1 5 3 225 4 5 4 5 126 3 1 3 1 227 ;28 %mac_pgm例2 宏变量与宏程序可结合使用01 * Program_10-3-1_2.sas */02 %let dsn=out1;03 %let yvar=Income;04 %let xvar=Age;05 %macro plot;06 Proc plot;07 plot &yvar*&xvar;08 run;09 %mend;10 DATA out1; 11 INPUT Income Age; 12 DATALINEs; 13 1500 23 14 2600 35 15 2000 28 16 3000 30 17 1800 19 18 ; 19 run; 20 DATA temp;21 set &dsn;22 if Age=20;23 %plot24 Proc print;25 Title subset of &dsn;26 run;在程序宏中,由“%*”开始的语句是宏注释语句, 或/* */括起来的语句也是宏注释语句,一般建议使用后者。它们用于对宏内做的事情作注解。当宏较长的时侯,是很必要的。当你定义完这些宏后,就可以通过调用宏来运行程序。10.3.2 含参数的宏程序带定位参数的宏程序语法及调用:%MACRO 宏程序名(参数1,参数2,。);语句;%MEND;(或%MEND宏程序名;) 宏程序名后面还可以加入多个宏参数, 参数即定义了宏变量.例3 01 /* Programs_1032sas */02 %MACRO mac_pgm(mac_data ,mac_var );03 PROC FREQ DATA = &mac_data ;04 TITLE 数据来源:&mac_data ;05 TABLE &mac_var;06 RUN ;07 %MEND ;08 DATA out1;09 INPUT var_a$ ;10 DATALINES;11 1 2 3 3 212 4 1 2 2 113 3 5 1 2 114 2 3 3 1 215 3 3 3 4 516 ;17 RUN;18 DATA out2;19 INPUT var_b$ ;20 DATALINES;21 3 1 1 2 122 2 1 1 3 323 2 1 5 3 224 4 5 4 5 125 3 1 3 1 226 ;27 RUN;28 %mac_pgm(out1 , var_a)29 %mac_pgm(out2 , var_b)例4%MACRO mac_pgm(mac_data );DATA &mac_data;INFILE d:&mac_data.txt ;INPUT var_a$ ;RUN;PROC FREQ DATA=&mac_data;TITLE data source: &mac_data.txt;TABLE var_a;RUN;%MEND;%mac_pgm(out1)%mac_pgm(out2)带关键词参数的宏程序语法及调用:%MACRO 宏程序名(参数名1=值1,参数名2=值2,参数名3= ,。);语句;%MEND;(或%MEND宏程序名;)有了这种形式,在宏程序调用时其中的参数的位置可以任意,比较灵活。例5 01 /* Programs_1032sas */02 %MACRO mac_pgm(mac_data ,mac_var );03 PROC FREQ DATA = &mac_data ;04 TITLE 数据来源:&mac_data ;05 TABLE &mac_var;06 RUN ;07 %MEND ;08 DATA out1;09 INPUT var_a$ ;10 CARDS;11 1 2 3 3 212 4 1 2 2 113 3 5 1 2 114 2 3 3 1 215 3 3 3 4 516 ;17 RUN;18 DATA out2;19 INPUT var_b$ ;20 CARDS;21 3 1 1 2 122 2 1 1 3 323 2 1 5 3 224 4 5 4 5 125 3 1 3 1 226 ;27 RUN;28 %mac_pgm(mac_data=out1 ,mac_var=var_a)29 mac_pgm(mac_var=var_b, mac_data=out2) 宏变量的另一种分类:1局部宏变量:在宏程序中出现在参数位置上的宏变量,当宏程序调用后,它不再有效; 2全局宏变量。注:如果要查看用户自定义的全局宏变量,可以提交语句%put _GLOBAL_;如果要查看所有用户自定义的局部宏变量,可以提交语句%put _LOCAL_;创建全局宏变量的语句:%global 宏变量名;10.3.3 一些宏程序内部的宏语句1. 循环语句%MACRO 宏程序名;语句;%DO 指标变量=起点 %TO 终点 %BY 增量;文本;%END;%MEND;01 /* Programs_10-4-1.Sas */02 %MACRO mac_pgm;03 %DO i=1 %TO 2 ;04 DATA out&i ;05 INFILE c:TST_8-3-3-out&i.txt ;06 INPUT var_a$ ;07 RUN;08 PROC FREQ DATA=out&i.;09 TITLE 数据来源 :TST 8-3-3-out&i.txt ; 10 TABLE var_a;11 RUN; 12 %END ;13 %MEND;14 %mac_pgm%macro names(name=, number=);%do n=1 %to &number;&name&n%end;%mend names;data %names(name=out,number=5);run;2. 条件分支语句01 /* Programs8-4-2.Sas */02 %MACRO mac_pgm;03 DATA out1;04 INFILE c:TST 8-3-3-out1.txt;05 INPUT var_a$ ;06 RUN;07 %IF &SYSDAY. EQ Sunday08 %THEN %DO;09 PROC PRINT DATA = out1;10 RUN;11 %END;12 %ELSE %DO;13 PROC FREQ DATA = out1;14 TABLE var_a;15 RUN;16 %END;17 %MEND;18 %mac_pgm %DO %UNTIL %DO %WHILE %DO %END 10.3.5 宏程序的存储与调用 存储) 直接把宏程序存储为扩展名为的程序;) 通过语句options mstored sasmstore=逻辑库名把已经编译的宏存放在指定逻辑库的名为sasmacr的目录册中。例:libname test c:;options mstored sasmstore=test;%macro aa/store des=test;%mend; 调用) 对于上述第一种情况,使用全局语句%include 路径.文件名即可调用) 对于上述第二种情况,使用libname test c:;options mstored sasmstore=test;%aadata a;input x y;datalines;0 20 1 80;libname test c:;options mstored sasmstore=test;%macro aa/store des=test;proc freq data=a;table x;weight y;run;%mend;%aa附录:Macro Dictionary %BQUOTE and %NRBQUOTE CMDMAC %CMPRES and %QCMPRES %* comment %COMPSTOR %DATATYP %DISPLAY %DO, Iterative %DO %UNTIL %DO %WHILE %DO %END %EVAL EXECUTE %GLOBAL %GOTO %IF-%THEN/%ELSE IMPLMAC %I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论