SAS宏语言基础1.SAS宏工具的基本概念和功能扩展定制SAS操作减少文本输入量文本操作工具SAS编程更加灵活高效2.两个新的工作对象宏:以%标识功能较复杂文本替换功能宏变量:以&标识功能较简单3.SAS宏工具的功能结构宏语言语法规则宏处理器SAS其它功能模块工作单元4.SAS宏标识符(宏触发器)宏变量解析宏变量引用宏调用宏操作宏语句宏函数5.SAS宏运行机制SAS程序文本替换操作词语扫描器宏触发器&和%SAS宏工具SAS编译器不包含任何宏代码8二、SAS宏工具主要功能单元91.宏变量101.1宏变量的定义及其基本特性%letmv01=heightvar001;datatest;宏变量是由SAS名字标识的字符串。inputsex&mv01;datalines;……;run;procprintdata=test;var&mv01;run;宏变量值取值类型及变量长度。宏变量值的恒定性。与SAS数据集变量的区别。宏变量的应用场合。111.2用户定义宏变量与自动宏变量%letdataset=sashelp.class;%lettime=20050727;%put_user_;用户自定义宏变量%put_automatic_;title“Reportproducedat&sysdate9.,&sysday”;自动宏变量121.3局部宏变量与全局宏变量局部宏变量。%macrotest;%letlocalvar=12345;%put_user_;%mend;%test全局宏变量。%letglobalvar=2005;%globalsasvar;%put_user_;局部宏变量局部符号表全局宏变量全局符号表131.4宏变量的使用%letvar=weight;%letdata=sashelp.class;procprintdata=&data;var&var;宏变量引用字符常量中引用宏变量,须使用双引号title“Contentsofdataset&dataforvariable&var”;run;%leti=10;%letj=5;%lett1=textinline&j;字符与宏变量可直接连接使用分隔符连接字符与宏变量。%lett2=textinline&j.page&i.underscored;%letlib=sashelp;%letdata=&lib..class;宏变量引用后圆点符号的使用141.5宏变量的间接引用%macrotest;data_null_;setsashelp.classend=last;创建一系列宏变量,lev1,lev2,…callsymput((“lev”||compress(_n_)),age);iflastthencallsymput(“levn”,compress(_n_));run;存储上述宏变量%doi=1%to&levn;%putlev&i=&&lev&i;%end;宏变量间接引用总个数的宏变量%mendtest;在各级别的宏变量名称前添加2的k-1次方个&15宏变量间接引用的工作机制文本字符串文本替换&字符扫描宏处理器&&lev&i&lev114161.6应用宏函数处理宏变量值%leta=weight/height/sex;%letb=%scan(&a,2,/);%letc=%substr(&a,8,6);%leti=9;%letj=%eval(&i*2+1);%letk=%scan(&a,1,/)is%eval(&i*7-3)kg;宏函数可与字符混合使用,也可同时使用多个函数,且其前后顺序可任意排列172宏的定义与调用182.1宏的概念与功能宏调用宏:已编译程序段特定代码文本可接受宏参数可执行逻辑控制等各项操作功能192.2宏的定义与调用以%macro语句为开始宏%macromtest(times);的%doi=1%to×%putputtingprocessisperformedfor&itimes;定%end;义%mendmtest;以%mend语句为结尾宏调%mtest(10)用202.3宏参数位置参数当前宏的局部宏变量带默认值的关键字%macroparatest(pos1,pos2,key1=default1,key2=default2);%putthefirstpositionalparameteris&pos1;%putthesecondpositionalparameteris&pos2;%putthefirstkeywordis&key1;%putthesecondkeywordis&key2;%mendparatest;/*仅有两个位置参数,关键字将取默认值*/%paratest(para1,para2)/*位置参数变换位置,关键字取给定值*/%paratest(para2,para1,key1=keyword1,key2=keyword2)/*关键字变换位置,不影响输出结果*/%paratest(para1,para2,key2=keyword2,key1=keyword1)213.宏表达式223.1文本表达式%leta=weight/height/sex;%letb=%scan(&a,1,/);为宏变量赋值典型的文本表达式,由字符文本、宏变量引用、宏函数以及宏调用等组合而成%letc=variable&b.and%substr(&a,8,6);title“variable&b.and%substr(&a,8,6)selected”;产生字符串常量233.2逻辑表达式(1)逻辑表达式%macrocomparen(var1,var2);%if&var1&var2%then%put&var1isgreaterthan&var2;%else%if&var1=&var2%then%put&var1equals&var2;%else%put&var1islessthan&var2;%mendcomparen;%comparen(1,2);数字(整数)符号间的比较,类似数字间的比较%comparen(10,6.0);浮点数符号间的比较,类似字符间的比较243.2逻辑表达式(2)浮点数运算函数%macrocomparef(var1,var2);%if%sysevalf(&var1&var2)%then%put&var1isgreaterthan&var2;%else%if%sysevalf(&var1=&var2)%then%put&var1equals&var2;%else%put&var1islessthan&var2;%mendcomparef;%comparef(-1.1,0.2);%comparef(10,6.0);将获得正确的浮点数比较结果253.3算术表达式%leta=%eval(1+2);%letb=%eval(10*3);%letc=%eval(4/2);%leti=%eval(5/3);%leta=%sysevalf(10.0*3.0);%letb=%sysevalf(10.5+20.8);%leti=%sysevalf(5/3);%eval函数遵照整数运算法则%sysevalf函数遵照浮点数运算法则注意:算术表达式虽然进行数学运算,但其结果仍将转换为字符串。264.宏语句关键字SAS名字、字符串等组成的代码%leta=%eval(1+2);以分号为语句结尾标志%doi=1%to&n;%do%while(expression);%do%until(expression);%ifexpression%thenstatement;执行时会自动调用%eval函数Tips:当log窗口中报告有关%eval函数的错误信息而所执行代码中本身并未包含对%eval的引用,则应检查是否存在上述4个语句的代码编写错误。274.1可在开放代码中使用的宏语句宏语句%*comment%COPY%DISPLAY%GLOBAL%INPUT%LET%MACRO%PUT%SYMDEL%SYSCALL%SYSEXEC%SYSLPUT%SYSRPUT%WINDOW功能含义注释语句。拷贝语句,从SAS库中拷贝指定的对象。显示宏语句窗口。创建一个全局宏变量。在宏执行过程中为宏变量赋值。创建一个宏变量,同时对其进行赋值。标识一个宏定义的开始,指定所定义宏的名称及参数等。将指定的文本或宏变量的值写入log窗口。删除指定的宏变量。调用SAS字程序。提交操作系统命令。在远程主机或服务器上定义一个新的宏变量或修改一个已存在宏变量的值。将远程主机上一个宏变量的值赋给本地主机上的宏变量。定制一个用户自定义的窗口。4.2仅在宏定义中使用的宏语句28宏语句%ABORT%DO%DO,Iterative%DO%UNTIL%DO%WHILE%END%GOTO%IF-%THEN/%ELSE%label:%LOCAL%MEND%RETURN功能含义中止当前宏的运行。开始一个%do代码块。开始一个%do循环语句。执行指定的语句直至指定的条件为真。当指定的条件为真时执行指定的语句标识一个%do代码块(包括上述4种%do语句)的结束。使宏运行进程跳跃到指定的标签所标识的位置。条件语句,有条件执行指定的代码。在特定的代码位置上给出一个标签,以备%goto语句使用。创建一个局部宏变量。标识一个宏定义的结束。引导当前宏的正常终止。5.宏函数(1)29%leta=%scan(&b,2);%letb=%length(&a);%leti=%eval(12+13);%letj=%sysevalf(3.5/2);字符宏函数,执行字符串处理有关的功能计算宏函数,执行算术计算有关的功能%letr=x;y;%scan,%qscan,%substr以及%qsubstr等函数在运行时会在后台自动调用%eval函数。%lets=%str(x;y);%lett=%nrstr(95%%CI);引用宏函数,执行特殊字符屏蔽功能305.宏函数(2)%sysfunc是除上述三类外,其它宏函数中昀为常用的一个,通过该函数,用户可以在宏代码中直接调用SAS函数及用户自定义函数。%lettbid=%sysfunc(open(sashelp.class,i));%letcnum=%sysfunc(attrn(&tbid,nvars));%letrnum=%sysfunc(attrn(&tbid,nobs));%letrc=%sysfunc(close(&tbid));%lettoday=%sysfunc(inputn(20050727,yymmdd8.));316.宏工具接口宏工具接口是其它SAS语言与SAS宏工具进行动态交互的桥梁,可使SAS其它模块在运行时能够动态访问SAS的宏语言元素。SAS提供了以下4个功能模块与宏工具的接口。(1)DATA步;(2)SQL;(3)SCL;(4)SAS/CONNECT。32DATA步接口data_null_;setsashelp.classend=last;retainagesum0;agesum+age;iflastthendo;symput子程序,将SAS数据集变量值传递给指定的宏变量callsymput(totage,agesum);callsymput(totnum,compress(_n_));end;run;%letagem=%sysevalf(&totage/&totnum);datatest;setsashelp.class;symget函数,将指定宏变量的值传递给SAS数据集变量average=symget(agem);agedif=age-average;run;33三、实例分析与操作目标:编制一个带参数的宏,用以执行计量资料(成组设计)的统计学处理工作。包括数据描述和统计学分析两个方面的任务。实现方式:数据描述采用means过程,观察指标的组间比较采用anova过程或ttest过程。流程控制:根据分组变量的水平数选择适当的SAS过程进行数据处理。涉及的主要宏工具元素:宏(目标产品),宏变量(包括间接引用