第51章 SAS宏简介

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

来,这样可以使用户在几个地方使用相同的文本或反复使用一段程序,因为我们可以改变每 一次的值。例如:
%let mmm=oxy; Data new&mmm;
Set xx.&mmm; More SAS statements;
Run; 当这段 SAS 程序提交给 SAS 系统执行后,在 SAS 中看到的语句是:
%END; 若增量是 1,则不写%BY 语句。 例SASTJFX51_2.SAS:
libname xy 'path'; /*建 立 数 据 库 xy, path为 数 据 库 xx的 路 径 */ data flower;
set xy.flower; run; /*在SAS/WORK库中利 用 数 据 库 xy中 的 数 据 集 flower生 成 临 时 数 据 集 flower*/ %macro ae(outdat,indat,list_var,n); /*建 立 一 个 宏 ae*/ data &outdat;
第 51 章 SAS 宏简介
本章将介绍有关 SAS 中宏功能的一些基本知识和用法。主要包括宏功能的简要说明, 宏变量的创建和引用,举例介绍带参数的宏以及宏循环语句和宏函数的含义和用法,并对宏 与数据步的信息交换,如何在 PROC SQL 中创建宏变量等内容进行了简单的介绍。
51.1 宏功能简介
SAS 的宏功能(macro facility)可以按照用户的需要对 SAS 进行扩充和定义,以减轻在 完成一些相同的统计分析时的文本录入量。用户可以通过宏功能命名一个字符或一组 SAS 程序语句,并在此后的任务中使用这个名字而不是原来的文本。
%macro 宏名称(参数 1,参数 2,...); 纯文本;
%mend 宏名称; 其中参数列表中是用逗号分开的参数名,参数列表中提到的参数是宏文本中可以作为宏 变量引用。如:
%macro hb(outdat,var); data &outdat;
set output1; rename &var=ee; keep dn &var tb1; run;
宏功能包括两个部分:宏处理器是 SAS 系统中完成宏功能的部分,宏语言是用户与宏 处理器交流的句法语言。
当 SAS 系统编译程序文本时,两种定义符触发宏处理器工作:&名字,为宏变量标记, 指定一个宏变量;%名字,指定一段宏。
51.2 宏变量
宏变量是比较基本的 SAS 宏。宏变量的值的最大长度为 32K 字符。一个宏变量的具体 长度是由赋值给它的文本而不是一个明确的长度定义决定的。因此它的长度是随着它所包含 的内容变化的。宏变量只包含字符型数据。
51.4 宏函数
表 51-1 宏计算函数
函数名
说明
%EVAL 计算算术和逻辑表达式 %INDEX 寻找在一字符串中第一次出现的某个字符串
函数名 %LENGTH %QSCAN %QSUBSTR %QUPCASE %SCAN %SUBSTR %UPCASE
表 51-2 宏字符函数
说明 返回自变量的长度 扫描包括%和&的单词 提取字符串中的包括%和&的字串 转换包括%和&的小写字符为大写字符 扫描单词,并返回一个结束引用的结果 提取字符串中的子串 转换小写字符为大写字符
%let mmm=xx; Data &mmm1 &mmm2;
Set &mmm.oxy; Run; 这时 SAS 并不会使用 xx1 xx2 两个数据集,而且给出出错信息。因为 SAS 把 mmm1 mmm2 当成了两个合法的宏变量,而不是引用宏变量 mmm。在这种情况下,要使用宏变量 引用定界符“.”,上面第二句正确写法为:data &mmm.1 &mmm.2;这时 SAS 代码编译窗口 看到的是 Data xx1 xx2。 51.2.3 显示宏变量的值 显示宏变量的值最简单的方法是使用%put 语句,它将在 SAS 的 Log 窗口显示结果。 例:%let x=name; %let y=weight height; %put &x***&y***; 结果如下:name***weight height*** 51.2.4 改变宏变量的值 如果想在 SAS 程序中改变宏变量的值,只要在宏变量值改变之前的语句中使用%LET 语句对其重新赋值即可。 51.2.5 间接引用宏变量 如果用户有一系列宏变量,如 city1、city2、…city20,变量名中的数字是由宏变量 n 来 表示的,当前 n 的值为 6,如果想表示宏变量 city6 的值,使用下面的语句: %put &city&n 这时 SAS 将显示出错信息,因为 city 不是一个宏变量。在这种情况下,应该用下面的语 句:
例:
1、 用%EVAL 函数计算宏表达式的值。
%let x=100;
%let y=%eval(&x+200);
%let z=&x+200;
%put y=&y z=&z; 提交这段 SAS 程序后,Log 窗口显示的结果为:y=300 2、 用%substr 函数生成某字符串的子串。
3. 宏循环语句的进一步讨论 类似于数据步带条件的循环语句 DO WHILE 和 DO UNTIL,宏程序中也有功能类似的 %DO %WHILE 和%DO %UNTIL。它们的一般形式为: %DO %WHILE(表达式);
文本; %END; 例如: 在%DO %WHILE 循环开始对表达式赋值,当表达式成立时就重复提交文本进行处理。 %DO %UNTIL(表达式);
%macro 宏名称; 文本;
%mend 宏名称; 当一个宏被提交时,系统就对它进行宏编辑,但不会执行。检查宏语句的语法,若有错 误在 Log 窗口显示。 使用一个宏进行运算,一定要调用宏,宏调用的一般形式为:
%宏名称 它有以下特点:就在宏名称前加%进行调用;
类似于宏变量的引用,可以在程序的各处调用; 调用可以不加分号,也可以加分号。 51.3.2 带参数的宏 宏参数是一种特殊的宏变量,是定义在%MACRO 语句内的宏变量。 带参数的宏的一般形式为:
%put &&city&n SAS 解析上述语句时,把&&解析成&,而把 city 作为文本,把&n 解析成 6,这样就返 回了一个宏变量引用&city6,最后%put 语句显示出宏变量 city6 的值。 例SASTJFX51_1.SAS:
%let city1=shanghai;%let city2=beijing; %macro listthem;
set &indat; %do i=1 %to &n.; %let var=%scan(&list_var, &i.); rename &var=v&i.;
%end; run; /*此 宏 的 功 能 是 用 scan函 数 取 出 数 据 集 的 变 量 名 重 新 命 名 */ %mend ae; %ae(aa,flower,customerid saledate,2); /*运行程序后,临时数据集aa中的customerid、saledate 两个变量名更 换 为 v1、 v2*/ 2. 嵌套宏循环语句 宏循环语句也可以采取嵌套形式,即在宏循环语句%DO-%END 内部,可嵌入另一个 %DO-%END 循环语句,称为嵌套宏循环。其形式为: %DO I=1 %TO I1; %DO J=1 %TO J1; 文本或宏程序语句;
%mend hb; 调用带参数的宏的一般形式为:
%宏名称(参数值 1,参数值 2,…) 每个参数值将代入宏定义中相应位置的参数。
带参数的宏可以把宏变量和宏结合在一起,成为宏功能编程的强有力的方法。如:
%hb(outp1,e11);
%mean(data=zu4,var=stand,label=身高,title=4 组 1 个变量-身高,pair=Y,ci=y,cn=y);
%do n=1 %to 2; &&city&n %end; %mend listthem; %put %listthem; 结果如下:shanghai Beijing
51.3 宏
51.3.1 宏简介 宏是一段编辑好的程序,用户可以在提交 SAS 程序或 SAS 命令中调用。除了用宏产生 文本外,宏还有下面两个功能; 包含程序语句,控制什么时候和如何产生文本; 接受参数,产生用于多处的通用的宏。 定义宏的格式:
表 51-3 宏引用函数
函数名
说明
%BQUOTE %NRBQUOTE %NRQUOTE %NRSER %QUOTE %STR %SUPERQ %UNQUOTE
引用一个可分辨的值,包括未处理的特殊符号和寄存器操作符 引用一个可分辨的值,包括未处理的特殊符号和寄存器操作符 引用一个可分辨的值,包括&和% 引用固定文本,包括%和& 引用一个除%和&之外的可分辨值 引用除%和&之外的固定文本 引用具有不确定变量值的宏变量 没有被引用
%let mmm=oxy; Data newoxy;
Set xx.oxy; More SAS statements;
Run; 如果想在 Log 窗口中看到宏变量解译后的代码,则需要先运行 options symbolgen;语句, 否则上述代码只能在代码编译窗口中看到,但这一窗口是不可见的。 有时我们要在文本中对宏变量定界,如:
文本; %END; 例 SASTJFX51_4.SAS:
%macro aa; %let i=1; %do %while(&i.<=10); %put &i.; %let i=&i.+1; %end;
%mend aa; %aa;
提交这段 SAS 程序后,在 SAS 的 Log 窗口来自百度文库示如下结果:
在%DO %UNTIL 循环中先提交文本进行处理,然后对表达式赋值,当表达式成立时就 停止重复提交文本。
%END; %END; 例 SASTJFX51_3.SAS:
%let n=xx;
%macro mac; %do i=1 %to 10; %do j=1 %to 10; %put &n&i&j; %end; %end;
%mend; %mac; 提交这段 SAS 程序后,SAS 的 Log 窗口就会出现如下结果:
51.3.3 宏循环语句 1. 设定循环次数的%DO 循环语句 在数据步程序中,要实现同一组语句的重复执行,可使用 DO 循环语句。在宏程序的水 平上,要实现一段文本的重复执行,可使用宏循环语句,设定循环次数的%DO 循环语句的 一般形式为:
%DO 指标变量=始点 %TO 终点 (%BY 增量) 文本或宏程序语句
用户可以用%PUT _ALL_查看当前 SAS 运行过程中所有可以利用的宏变量。 51.2.1 创建宏变量及对其赋值 定义宏变量并赋值的最简单方法是使用宏程序语句%LET,其形式为: %LET 宏变量名=宏变量值 宏变量值是一串字符,可以包括任何字母、数字或键盘上可以找到的可打印符号,字符 间可有空格。如果一个宏变量已经存在,赋给它的值将取代当前值。如果一个宏变量或它的 值中包括宏控制符(%或&),则先对控制符解释后再进行赋值。如: %let name=shanghai; %let city=&name; (city=shanghai ) 一般情况下,宏处理器将英文字母、数字和符号(%和&除外)看作是字符。需要时, 可用%EVAL 和%SYSEVALF 函数求出宏变量的整数值或浮点值。如 %let x=(100+123); 生成(100+123); %let x=%eval(100+123); 生成 223; %let x=%sysevalf(5.65+10); 生成 15.65; 51.2.2 引用宏变量 在创建了一个宏变量之后,使用它的方法是在它的名字前面加一个&符号。要解析一个 文本串中的宏变量并予以引用,要把这个文本串用双引号括起来,单引号中的宏变量引用不 被解析,例如: %let city=shanghai; Title1“data of &city“; 显示 data of shanghai; Title2’data of &city’; 显示 data of &city; 用户可以根据需要在 SAS 程序中多次引用宏变量,宏变量的值保持不变,直到用户改 变它为止。 有时需要将宏变量引用和前导文本或末尾文本合并起来,或和另一个宏变量引用合并起
相关文档
最新文档