SAS宏入门
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• • • • 1、宏变量 2、宏 3、宏应用实例 4、如何提高宏的运行效率
一、宏变量
1、1
简介:
• 宏变量:SAS程序中通过替代符号动态地更改文本的工
具;只包含字符型数据。 具体长度是由赋值给它的文本决定的。 值的最大长度为:32K字符
• 分类:用户定义的宏变量
自动宏变量
全局宏变量 局部宏变量
SAS 系统看到的程序为:
DATA TEMP; SET DATA1; IF SEX=1; RUN; PROC PRINT; TITLE“SUBSET OF DATA SET DATA1“ RUN; DATA TEMP; SET DATA2; IF SEX=1; RUN; PROC PRINT; TITLE “SUBSET OF DATA SET DATA2“ RUN;
1、3 用户定义的宏变量(1)
• 定义宏变量方法:
• 宏变量名必须以字母和下划线开始,后面跟字母 或数字。 • 可以给任意宏变量命名,只要这个名称不是保留 字(见表22、2)。 • 建议不要使用AF、DMS、SQL、SYS等前缀,因 为SAS软件常常把他们用在自动宏变量中。 • 可以使用%PUT_ ALL_查看到所有用户创建的宏 变量。
◆ 系统选择SYSBOLGEN 会显示对宏变量的解析。例如,宏
变量PRGM和SITE的值分别为PRINTSASUSER.ROOM: options sysbolgen; %let title=“%upcasw(&prgm) of %upcase(&site)”; 在上面语句中,SYSBOLGEN选择项会在log窗口显示:
表22.1
状 态 只读
按类别划分的自动宏变量(续表)
变 量 内 容
SYSCHARWIDTH 字符串宽度值 SYSDATE 表示当前SAS工作或运行期间日期的字符串(两年数份)
SYSDATE9 表示当前SAS工作或运行期间日期的字符串值(两年数份) SYSDAY SAS 工作或运行期间的星期几 SYSENV 前景或背景荧光屏指示符 SYSERR SAS 过程或数据步设置的返回代码 SYSINDEX 目前工作期间已经执行的宏数 SYSINFO 返回代码信息 SYSJOBID 目前一批工作或用户ID的名称(随主机环境改变) SYSMENV 当前宏运行的环境 SYSPROCESSID 当前SAS操作的ID SYSPROCESSNAME 当前SAS操作的名称 SYSSCP 操作系统的缩写 SYSSCPL 操作系统的名称 STSSITE SYSSTARTID 分配给用户的地点的号码 最后一个STARTSAS语句产生的ID
SAS 看到的语句是:
DATA MEWBOUGHT; SET SAVE.BOUGHT; more SAS statements IF NUM>1000;
RUN;
注意:宏变量引用不需要连接操作符,SAS系统会自动 构造结果字符,这与数据步不一样。
◆
有时我们要在文本中对宏变量定界, 看下面一段语句:
data &mmm.1 &mmm.2;
这时的SAS看到的语句是: DATA BOUGHT1 BOUGHT2; 如果“.”是SAS 的名字的一部分,要使用两个定界符, 如 下面两级数据集名的例子: set in&mmm..Temp; 这时SAS 看到的语句是:
SET INBOUGHT.TEMP;
注意:用户可以在任何宏变量引用后使用定界符,但只 有在起界定作用或“.”是SAS的名字的一部分 时,定 界符才被解析,所以,下面两名语句在 SAS来是等价的:
• 两种定义符:&名字(宏变量标记) %名字(一段宏)
简介:
• 对SAS程序书写的约定:
用户录入的程序用小写字母, SAS系统看到的程序用大写字母, 其中宏变量替代的部分用黑体字表示。
• 注意:有三个以%开头的SAS语句不是宏功能中
的内容,它们是%INDUCE、%LIST、%RUN语 句。
主要内容:
ቤተ መጻሕፍቲ ባይዱ
表22.1
状 态 变
按类别划分的自动宏变量(续表)
量 内 容
最后一个STARTSAS 语句产生的操作名称 当前SAS工作或运行期间时间的字符串值 当前SAS操作的用户ID或注册号 所运行的SAS的版本号 SAS软件的版本号和维护等级
SYSSTARTNAME SYSTIME SYSUSERID SYSVER SYSVLONG
title “&MMM.report”;
title “&MMMreport”; 它们都相当于:TITLE “bought”;
1、3 用户定义的宏变量(4) —— 3、显示宏变量的值
• ◆ 显示宏变量的值最简单的方法是使用%PUT语 句,它将在 • SAS的log窗口显示结果,如: • %let x=name; • %let y=weight; • %let z=height; • %put &x *** &y*** &z***; • log 窗口会显示下列文本: • name *** weight*** height***
表22.2 宏功能中的保留字
ABEND ABORT ACT ACTIVATE BQUOTE BY CLEAR CLOSE CMS COMANDR COPY DEACT DEL DELETE DISPLAY DMIDSPLY DMISPLIT DO EDIT ELSE END EVAL FILE GLOBAL GO GOTO IF INC INCLUDE INDEX INFILE INPUT KEYDEF LENGTH LET LIST LISTM LOCAL MACRO MEND METASYM NRBQUOTE NRQUOTE NRSTR ON OPEN PAUSE PUT QSCAN QSUBST QUOTE QSYSFUNC QUPCASE RESOLVE RETURN RUN SAVE SCAN STOP STR SUBSTR SUPERQ SYSCALL SYSEVALF SYSEXEC SYSFUNC SYSGET SYSRPUT THAN TO TSO UNQUOTE UNSTR UNTIL UPCASE WHILE WINDOW
SAS宏入门
SAS宏的作用
• • • • • 获取SAS系统信息 有条件执行数据步和过程步 开发交互式系统 产生与数据无关的SAS程序 在不同的SAS数据步和过程步之间传递数 据 • 重复执行SAS程序
简介:
• 定义:可以按照用户的需要对SAS系统进行扩充和定 义,以减轻在完成一些相同的统计分析任务时的文本 录入量。 • 宏功能包括: 宏处理器 宏语言
◆ 用户可以根据需要在SAS程序中多次引用宏变量,宏变
量,宏变量的值保持不变,直到用户改变它,例如:
%let mmm=Newcity;
Data temp;
If num>=800; run; proc print; title “Subset of Data Set &mmm”;
run;
◆ 每次出现宏变量引用&MMM,宏处理器用Newcity
1、3 用户定义的宏变量(6) —— 5、间接引用宏变量
• 原则:宏处理器从左到 • 比较: • %put &city &n • %put &&city &n
如:DATA=PERSNL&YR.EMPLOYES,其中&YR包括了两位数的年 份值)或和另一个宏变量引用合并起来(例如&MONTH&YR), 这样可以使用户在几个地方使用相同的文本或反复使用一段 程序,因为我们可以改变每一次的值。例如: %let mmm=bought; data new&mmm; set save. &mmm; more SAS statements if num>1000; run;
替代
它,所以SAS看到的语句是:
DATA TEMP;
SET NEWCITY;
IF NUM >=800; RUN; PROC PRINT; TITLE “Subset of Data Set Newcity”;
RUN;
注意:如果引用了有存在的宏变量,在SAS的log窗口会显 示警告信息。
◆ 有时需要将宏变量引用和前导文本或末尾文本合并起来(例
1、3 用户定义的宏变量(3) —— 2、引用宏变量:
在创建了一个宏变量之后,使用它的方法是在它的名 字前加一个与符号(&变量名),这称为宏变量引用 (macro variable reference),这一引用通过对宏变量 值的解析产生符号替代。要解析一个文本串中的宏变 量引用,要把这个文本串用引号括起来,单引号的宏 变量引用不被解析。比较下面两个TITLE语句的区别: • %let city=shanghai • title 1:“Data of &city”; • title 2: ‘Data of &city‟; • SAS 系统最后显示的标题分别是: • Data of shanghai和Data of &city
1、2 SAS系统定义的宏变量
• 除了SYSPBUFF之外,所有的自动宏变量 都是全局变量。 • 要使用自动宏变量,可以在&符号后跟上一 个宏变量名。如: footnote ”Report for & sysday, & sysdate”; • 用户可以给具有读/写状态的自动宏变量赋 值,但不能给只读状态的宏变量赋值。 • 使用% PUT_ AUTOMATIC_,可以看到所有 可以利用的自动宏变量。
可以使用%PUT_ALL_查看到所有用户创建的宏变量。
1、3 用户定义的宏变量(2) —— 1、创建宏变量及对其赋值
• 最简单方法:使用宏程序语句%LET,其形式为: %LET宏变量名=宏变量值 • 其他:%DO循环语句;
%GLOBAL语句; %INPUT语句; SQL中的SELECT语句的INTO语句; %LOCAL语句; %MACRO语句; SCL中的SYMPUT程序和SYMPUTN程序; %WINDOW语句。
表22.1 状态 变 量
SYSCC YSCMD SYSDEVIC SYSDMG SYSDSN SYSFILRC SYSLAST SYSLCKRC SYSLIBRC SYSMSG SYSPARM SYSPUBFF SYSRC
按类别划分的自动宏变量 内 容
读/写 SYSBUFFER
来自于%INPUT的不匹配的文本 SAS对用户的操作环境返回的当前状态代码 来自于宏窗口命令行的最后一个不可识别的命令 当前图形设备的名字 反映对一个损坏的数据集采取的措施的返回代码 最近使用的SAS数据集的两级名称 FILENAME 语句设置的返回代码 最近使用的SAS数据集的名称 LOCK语句设置的返回代码 LIBNAME语句设置的返回代码 宏窗口显示的信息 SYSPARM=系统选择项设定的值 宏参数值的文本 各种与系统有关的返回代码
SYMBOLGEN:Macro variable PRGM resolves to print;
SYMBOLGEN: Macro viaable SITE resolves to saauser. room
1、3 用户定义的宏变量(5) —— 4、改变宏变量的值
• 如果想在SAS程序中改变宏变量的值,只要在该宏变量值 • 改变之前的语句中使用%LET语句对其重新赋值即可,例 • 如下面这段程序: • %let a =data1; %let a=data 2; • data temp; data temp; • set &a ; set &a; • if sex=1 ; if sex=1; • run; run; • proc print ; proc print; • title “Subset of Data Set &a”; title”Subset of Data Set &a”; • run; run;
%let mmm=bought;
data &mmm1 &mmm2; set in&mmm.temp; run; ◆ 这时SAS并不会使用BOUGHT1和BOUGHT2两个数据 集,而且给出错误信息。这是因为SAS把MMM1和 MMM2当成了两个合法的宏变量名,而不是引用宏 变量MMM。在这种情况下,我们要使用宏变量引 用定界“.”,上面第二条语句正确的写法应该
一、宏变量
1、1
简介:
• 宏变量:SAS程序中通过替代符号动态地更改文本的工
具;只包含字符型数据。 具体长度是由赋值给它的文本决定的。 值的最大长度为:32K字符
• 分类:用户定义的宏变量
自动宏变量
全局宏变量 局部宏变量
SAS 系统看到的程序为:
DATA TEMP; SET DATA1; IF SEX=1; RUN; PROC PRINT; TITLE“SUBSET OF DATA SET DATA1“ RUN; DATA TEMP; SET DATA2; IF SEX=1; RUN; PROC PRINT; TITLE “SUBSET OF DATA SET DATA2“ RUN;
1、3 用户定义的宏变量(1)
• 定义宏变量方法:
• 宏变量名必须以字母和下划线开始,后面跟字母 或数字。 • 可以给任意宏变量命名,只要这个名称不是保留 字(见表22、2)。 • 建议不要使用AF、DMS、SQL、SYS等前缀,因 为SAS软件常常把他们用在自动宏变量中。 • 可以使用%PUT_ ALL_查看到所有用户创建的宏 变量。
◆ 系统选择SYSBOLGEN 会显示对宏变量的解析。例如,宏
变量PRGM和SITE的值分别为PRINTSASUSER.ROOM: options sysbolgen; %let title=“%upcasw(&prgm) of %upcase(&site)”; 在上面语句中,SYSBOLGEN选择项会在log窗口显示:
表22.1
状 态 只读
按类别划分的自动宏变量(续表)
变 量 内 容
SYSCHARWIDTH 字符串宽度值 SYSDATE 表示当前SAS工作或运行期间日期的字符串(两年数份)
SYSDATE9 表示当前SAS工作或运行期间日期的字符串值(两年数份) SYSDAY SAS 工作或运行期间的星期几 SYSENV 前景或背景荧光屏指示符 SYSERR SAS 过程或数据步设置的返回代码 SYSINDEX 目前工作期间已经执行的宏数 SYSINFO 返回代码信息 SYSJOBID 目前一批工作或用户ID的名称(随主机环境改变) SYSMENV 当前宏运行的环境 SYSPROCESSID 当前SAS操作的ID SYSPROCESSNAME 当前SAS操作的名称 SYSSCP 操作系统的缩写 SYSSCPL 操作系统的名称 STSSITE SYSSTARTID 分配给用户的地点的号码 最后一个STARTSAS语句产生的ID
SAS 看到的语句是:
DATA MEWBOUGHT; SET SAVE.BOUGHT; more SAS statements IF NUM>1000;
RUN;
注意:宏变量引用不需要连接操作符,SAS系统会自动 构造结果字符,这与数据步不一样。
◆
有时我们要在文本中对宏变量定界, 看下面一段语句:
data &mmm.1 &mmm.2;
这时的SAS看到的语句是: DATA BOUGHT1 BOUGHT2; 如果“.”是SAS 的名字的一部分,要使用两个定界符, 如 下面两级数据集名的例子: set in&mmm..Temp; 这时SAS 看到的语句是:
SET INBOUGHT.TEMP;
注意:用户可以在任何宏变量引用后使用定界符,但只 有在起界定作用或“.”是SAS的名字的一部分 时,定 界符才被解析,所以,下面两名语句在 SAS来是等价的:
• 两种定义符:&名字(宏变量标记) %名字(一段宏)
简介:
• 对SAS程序书写的约定:
用户录入的程序用小写字母, SAS系统看到的程序用大写字母, 其中宏变量替代的部分用黑体字表示。
• 注意:有三个以%开头的SAS语句不是宏功能中
的内容,它们是%INDUCE、%LIST、%RUN语 句。
主要内容:
ቤተ መጻሕፍቲ ባይዱ
表22.1
状 态 变
按类别划分的自动宏变量(续表)
量 内 容
最后一个STARTSAS 语句产生的操作名称 当前SAS工作或运行期间时间的字符串值 当前SAS操作的用户ID或注册号 所运行的SAS的版本号 SAS软件的版本号和维护等级
SYSSTARTNAME SYSTIME SYSUSERID SYSVER SYSVLONG
title “&MMM.report”;
title “&MMMreport”; 它们都相当于:TITLE “bought”;
1、3 用户定义的宏变量(4) —— 3、显示宏变量的值
• ◆ 显示宏变量的值最简单的方法是使用%PUT语 句,它将在 • SAS的log窗口显示结果,如: • %let x=name; • %let y=weight; • %let z=height; • %put &x *** &y*** &z***; • log 窗口会显示下列文本: • name *** weight*** height***
表22.2 宏功能中的保留字
ABEND ABORT ACT ACTIVATE BQUOTE BY CLEAR CLOSE CMS COMANDR COPY DEACT DEL DELETE DISPLAY DMIDSPLY DMISPLIT DO EDIT ELSE END EVAL FILE GLOBAL GO GOTO IF INC INCLUDE INDEX INFILE INPUT KEYDEF LENGTH LET LIST LISTM LOCAL MACRO MEND METASYM NRBQUOTE NRQUOTE NRSTR ON OPEN PAUSE PUT QSCAN QSUBST QUOTE QSYSFUNC QUPCASE RESOLVE RETURN RUN SAVE SCAN STOP STR SUBSTR SUPERQ SYSCALL SYSEVALF SYSEXEC SYSFUNC SYSGET SYSRPUT THAN TO TSO UNQUOTE UNSTR UNTIL UPCASE WHILE WINDOW
SAS宏入门
SAS宏的作用
• • • • • 获取SAS系统信息 有条件执行数据步和过程步 开发交互式系统 产生与数据无关的SAS程序 在不同的SAS数据步和过程步之间传递数 据 • 重复执行SAS程序
简介:
• 定义:可以按照用户的需要对SAS系统进行扩充和定 义,以减轻在完成一些相同的统计分析任务时的文本 录入量。 • 宏功能包括: 宏处理器 宏语言
◆ 用户可以根据需要在SAS程序中多次引用宏变量,宏变
量,宏变量的值保持不变,直到用户改变它,例如:
%let mmm=Newcity;
Data temp;
If num>=800; run; proc print; title “Subset of Data Set &mmm”;
run;
◆ 每次出现宏变量引用&MMM,宏处理器用Newcity
1、3 用户定义的宏变量(6) —— 5、间接引用宏变量
• 原则:宏处理器从左到 • 比较: • %put &city &n • %put &&city &n
如:DATA=PERSNL&YR.EMPLOYES,其中&YR包括了两位数的年 份值)或和另一个宏变量引用合并起来(例如&MONTH&YR), 这样可以使用户在几个地方使用相同的文本或反复使用一段 程序,因为我们可以改变每一次的值。例如: %let mmm=bought; data new&mmm; set save. &mmm; more SAS statements if num>1000; run;
替代
它,所以SAS看到的语句是:
DATA TEMP;
SET NEWCITY;
IF NUM >=800; RUN; PROC PRINT; TITLE “Subset of Data Set Newcity”;
RUN;
注意:如果引用了有存在的宏变量,在SAS的log窗口会显 示警告信息。
◆ 有时需要将宏变量引用和前导文本或末尾文本合并起来(例
1、3 用户定义的宏变量(3) —— 2、引用宏变量:
在创建了一个宏变量之后,使用它的方法是在它的名 字前加一个与符号(&变量名),这称为宏变量引用 (macro variable reference),这一引用通过对宏变量 值的解析产生符号替代。要解析一个文本串中的宏变 量引用,要把这个文本串用引号括起来,单引号的宏 变量引用不被解析。比较下面两个TITLE语句的区别: • %let city=shanghai • title 1:“Data of &city”; • title 2: ‘Data of &city‟; • SAS 系统最后显示的标题分别是: • Data of shanghai和Data of &city
1、2 SAS系统定义的宏变量
• 除了SYSPBUFF之外,所有的自动宏变量 都是全局变量。 • 要使用自动宏变量,可以在&符号后跟上一 个宏变量名。如: footnote ”Report for & sysday, & sysdate”; • 用户可以给具有读/写状态的自动宏变量赋 值,但不能给只读状态的宏变量赋值。 • 使用% PUT_ AUTOMATIC_,可以看到所有 可以利用的自动宏变量。
可以使用%PUT_ALL_查看到所有用户创建的宏变量。
1、3 用户定义的宏变量(2) —— 1、创建宏变量及对其赋值
• 最简单方法:使用宏程序语句%LET,其形式为: %LET宏变量名=宏变量值 • 其他:%DO循环语句;
%GLOBAL语句; %INPUT语句; SQL中的SELECT语句的INTO语句; %LOCAL语句; %MACRO语句; SCL中的SYMPUT程序和SYMPUTN程序; %WINDOW语句。
表22.1 状态 变 量
SYSCC YSCMD SYSDEVIC SYSDMG SYSDSN SYSFILRC SYSLAST SYSLCKRC SYSLIBRC SYSMSG SYSPARM SYSPUBFF SYSRC
按类别划分的自动宏变量 内 容
读/写 SYSBUFFER
来自于%INPUT的不匹配的文本 SAS对用户的操作环境返回的当前状态代码 来自于宏窗口命令行的最后一个不可识别的命令 当前图形设备的名字 反映对一个损坏的数据集采取的措施的返回代码 最近使用的SAS数据集的两级名称 FILENAME 语句设置的返回代码 最近使用的SAS数据集的名称 LOCK语句设置的返回代码 LIBNAME语句设置的返回代码 宏窗口显示的信息 SYSPARM=系统选择项设定的值 宏参数值的文本 各种与系统有关的返回代码
SYMBOLGEN:Macro variable PRGM resolves to print;
SYMBOLGEN: Macro viaable SITE resolves to saauser. room
1、3 用户定义的宏变量(5) —— 4、改变宏变量的值
• 如果想在SAS程序中改变宏变量的值,只要在该宏变量值 • 改变之前的语句中使用%LET语句对其重新赋值即可,例 • 如下面这段程序: • %let a =data1; %let a=data 2; • data temp; data temp; • set &a ; set &a; • if sex=1 ; if sex=1; • run; run; • proc print ; proc print; • title “Subset of Data Set &a”; title”Subset of Data Set &a”; • run; run;
%let mmm=bought;
data &mmm1 &mmm2; set in&mmm.temp; run; ◆ 这时SAS并不会使用BOUGHT1和BOUGHT2两个数据 集,而且给出错误信息。这是因为SAS把MMM1和 MMM2当成了两个合法的宏变量名,而不是引用宏 变量MMM。在这种情况下,我们要使用宏变量引 用定界“.”,上面第二条语句正确的写法应该