相关文章推荐
淡定的松树  ·  c# ...·  11 月前    · 

SAS | 宏(Macro)基础知识

1 概述

1.1 宏程序的两个基本部分

  • :命名型宏(name-style macros)的宏名称带“%”符号前缀。
    • 例外
      • 另外两种类型的宏不以%开头:命令型(command-style)和语句型(statement-style)。一般来说, 以前缀开头的宏 没有前缀的宏 优先级更高,因为更有效(宏处理器更快识别),且不易与SAS关键字混淆。
      • %INCLUDE、%LIST和%RUN语句不属于宏。
  • 宏变量 :宏变量名称带“&”符号前缀

1.2 局部宏变量与全局宏变量(根据作用范围的不同)

一般情况下,局部宏变量是在宏中定义的,仅可以在自己的宏中使用 [1]

在“开放代码” [2] 中定义的宏变量往往是全局的,可在程序的任何位置使用。

常见错误

  • 试图在宏以外使用局部宏变量
  • 创建的局部宏变量与全局宏变量的名称相同

1.3 宏系统选项——确保宏处理器处于开启状态

在使用宏之前,必须将MACRO系统选项开启。

在默认情况下,这个选项通常已经开启了,但也有可能被关闭,特别是在大型机上,因为SAS在不检查宏时运行速度会更快。如果不确定MACRO系统选项是否开启,可提交代码确定:

PROC OPTIONS OPTION=MACRO;
RUN;
Log

下面五类系统选项影响SAS将什么消息输出到日志, 粗体 为default:

  • MERROR | NOMERROR:若开启,当调用找不到的宏时,发出警告【WARNING:没有解析宏“???的调用。】
  • SERROR | NOSERROR:若开启,当使用找不到的宏变量时,发出警告【WARNING:没有解析符号引用???。】
  • MLOGIC | NOMLOGIC :若开启,在Log中打印有关宏的详细执行情况
  • MPRINT | NOMPRINT :若开启,在Log中打印由宏生成的标准SAS代码
  • SYMBOLGEN | NOSYMBOLGEN :若开启,在Log中打印宏变量的值

打开或关闭系统选项,在PROC OPTIONS OPTION=后输入以上十个中的任意几个即可。

2 用宏变量替换文本

遇到宏变量名称时,宏处理器简单地用宏变量的值 [3] 替换该宏变量的名称。

意义:批处理,文本替换量大时更方便

2.1 使用%LET语句创建宏变量(最简单的方式)

一般形式:

%LET macro-variable-name=value;

Attention :与普通的赋值语句不同,value不需要引号,即使包含字符串也不需要,等号和分号之间的所有内容都会成为该宏变量值的一部分

2.2 使用宏变量

宏处理器不会查找单引号内的宏,可用双引号:

%LET iterations=10;
%LET country=New Zealand;
DO i=1 to &iterations;
TITLE "Addresses in &country";

3 拼接宏变量与其他文本

3.1 拼接文本与宏变量

SAS遇到“&”符号时开始查找宏变量名,将到部分符号为止的字符作为宏变量名。

休止符号

  1. 空格
  2. 句号
  3. 分号
  4. 另一个“&”符号

Attention

  • 将两个宏变量连接在一起不需要在两个宏变量名间增加句点,因为第二个宏变量的“&”符号表示第一个宏变量的结尾。
  • 句点表示宏变量的结尾,解析文本不会将其包含在内

3.2 自动宏变量

每次调用SAS时,宏处理器自动创建的某些宏变量,可以直接使用:

4 创建模块代码

一般形式(不带参数)

%MACRO macro-name;
	macro-text
%MEND macro-name; /*macro-name是可选的有的话便于宏的调试和维护*/
%macro-name; /*调用宏*/

5 添加参数

参数:在调用宏时,所设定的宏变量的值

%MACRO macro-name (parameter-1= ,parameter-2= , … parameter-n= );
	macro-text
%MEND macro-name;

macro-text使用时在参数前加&

6 编写带条件逻辑的宏

宏语句只能在宏中使用,大部分宏语句在标准SAS代码中有对等语句,如%IF。

一般形式

%IF condition %THEN action;
	%ELSE %IF condition %THEN action;