acquirement-英语交流
第
10
章
SAS
宏功能
10.1
概述
SAS
系统的
MACRO
处理器可
以让程序更简洁更明了及更容易维护,帮助
用户在使用
SAS<
/p>
系统时更方便更自动化,具体来说,它具有以下功能:
1
.获取
SAS
的系统
信息;
2
.有条件地执行数据步和过程步;
3
.开发交互式系统;
4
.在不同的数据步和过程步之间传递数据;
p>
5
.重复执行
SAS
代码
等等。
.
SAS
宏语言的管理
1
.
MACRO
变量
2
.
MACRO
p>
程序语句
3
.<
/p>
MACRO
表达式和函数
10.2
SAS
宏变量的使用与定义
宏变量<
/p>
(
有时也称符号变量
)
< br>属于
SAS
宏语言的范畴
,
p>
和数据步中
的变量的概念是不一样的。
除了
数据行外
,
你可以在
SAS
程序的任何
地方定义和使用宏变量
。数据步变量是
和数据集相联系的
,
而宏变量
是独立于
数据集的。数据集变量的值取决于正在处理的观测
,
而一个
p>
宏变量的值总是
不
变
,
直到被明确改变。宏变量类似于一般变量的命
名方法。程序
中以
&
宏名
来引
用
MACRO
变量(有时为了清晰起
见
,也可以通过
&
宏名
.
来
引用
MACRO
变量)
SAS
宏变量共有两种:
1
.
2
.
系统宏变量
用户自定义的宏变量。
10.2.1
系统宏变量
一些系统宏变量
01
/* Program_ */
02
DA
TA
_NULL_;
03
PUT 'SYSDATE='
TE
/*
执行时的日期
*/
04
PUT
'SYSDAY='
/*
执行时是星期几
*/
05
PUT
'SYSENV='
/*
交互模式或批次模式
*/
06
PUT
'SYSSCP='
/*
返回正在用的操作系统
*/
07
PUT 'SYSJOBID
= '
/*
程序的操作执行代码
*/
08
PUT
'SYSERR='
/*
程序执行的错误码
*/
09
PUT
'SYSRC='
/*
程序执行的回复码
*/
10
PUT 'SYSLIBRC='
/*
使用
LIBNAME
时设置是否正确
*/
11
PUT
'SYSFILRC='
/*
p>
使用
FILENAME
时设置是否正确
p>
*/
12
RUN;
使用宏语句
%put
_automatic_;
可以查看所有的系统宏变量,结果
显示在
LOG
窗口。
SYSDATE=20OCT08
SYSDAY=Wednesday
SYSENV=FORE
SYSSCP=WIN
SYSJOBID = 384
SYSERR=0
SYSRC=0
SYSLIBRC=0
SYSFILRC=0
NOTE: DATA statement used:
real time
0.03 seconds
cpu time
0.01 seconds
10.2.2
用户自定义宏变量
定义方法及其使用
:
等号右边可以是数值或字符串表达式,字符串用引号
括起来
.
字符串前后的空格赋值前被删除。
%LET mac_var=
取值
等号左边是宏名
.
< br>定义好的
MACRO
变量可以在不同的
< br>SAS
数据步或过程步
中重复使用,该
< br>MACRO
变量的值不会改变
.
引用时直接用
&
宏名
.
即可
.
宏变
量定义可以放在程序的任何位置,
但在使用之前一定要定义好
.
例
1
01
/* */
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
010203
09
010721
10
010322
11
010723
12
010103
13
010402
14
;
16
PROC PRINT;
17
TITLE
数据月份
:&mm
18
RUN;
注:这里的标题必须用双引号括起来
,
而不能用单引号
,
因为
宏处理器只对双引号
< br>中引用的宏变量进行这种处理
,
而把单引号中的所有字符
都看作是标题的内容。
结果:
数据月份
: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
变量
< br>
例
2
一个宏变量代表一行语句时
01
/* Program_ */
02
%LET mm =
INPUT
var_a :YYMMDD6.;
03
DATA outl;
04
FORMAT var_a
YYMMDD10.;
05
&mm;
06
DATALINES;
07
010203
08
010721
09
010322
10
010723
11
010103
12
010402
13
;
14
RUN
一些宏函数
1
)宏函数
%str
例
3
一个宏变量代表多行语句时,可
用宏函数
%str
来实现
01
/*
Program_10-2-3_ */
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
数据步有关的一些宏函数
p>
2
)宏函数
%EV
AL
:当表达式中数字为整数时,把表达式转化为具体数值赋给
宏变量。如果表达式中数字不是整数,使用函数
%sysevalf(
< br>表达式
)
。
例
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/3
359
%let c3=%sysevalf(10.5/3);
360
%put &m1 &m2
&c1
&c2 &c3;
10/2 10.5/3
5
3.5
2
)宏函数
%SYSFUNC
(数据步函数名(自变量)
,
<
输出格式
>
)
功能:将数据步的函数值传递给宏变量。
例
6
%let
mm=sqrt(3+2);
%let
ss=' a3 '
data
aa;
x=&mm;
y=&ss;
run
;
结果:
Obs
x
y
1
2.23607
a3
<
/p>
这种情况下,
赋值运算使宏变量的值直接进行转化。
但如果不是赋值语句,
则必须使用宏函数
%let
mm=datetime();
%let
m2=
%sysfunc
(datetime(),datetime20.);
title
&mm
;
title2
;
title3
;
%put
data
a;
x=&mm;
p>
y=
%sysfunc
(today(),
yymmdd6.
);
proc
print
;
format
x
datetime20.
;
run
;
100
%put
20OCT1993:10:38:06
datetime()
07:57 Wednesday, October
20, 2008
4
20OCT1993:10:38:06
20OCT1993:10:38:06
Obs
x
y
1
20OCT1993:10:38:06
< br>3
)函数
CALL
SYMPUT
用法:CALL
p>
SYMPUT
(
’
宏变量名
’
,变量或表达式)
功能:在数据步中,把一些变量或计算结果赋给宏变量。
data team1;
input position :
$$8. player : $$12.;
call symput
(position,player);
datalines;
shortstp Ann
pitcher Tom
frstbase Bill
;
proc
print
;
run
;
data c;
input holiday
mmddyy.;
call symput('holdate',trim(lef
t(put(holiday,worddate.))));
datalines;
070497
;
run;
proc
print
;
run
;
%put
函数
SYMGET
用法:
SYMGET
(
’
宏变量名
’
)
功能:在数据步中,调用已经定义好的宏变量。
data
b;
x=symget(
'holdate'
);
proc
print
;
run
;
931020
%LENGTH
%UPCASE
%SUBSTR
%SCAN
详见
p525
SQL
过程中定义宏变量的方法
PROC SQL;
Select
变量
1
,变量
2
,
……
INTO :
宏变量
1
,:宏变量
2
p>
,
……
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
程序是
p>
经常重复使用时,便可通过宏程序的方式来简化编程
.
10.3.1.
简单定义及引用
语法及调用:
%MACRO
宏程序名;
语句;
%MEND;
(或
%MEND
宏程序名;
)
调用
:
%
程序名
这一行语句可出现在
SAS
程序的任何位置
,
除了数据行
< br>.
注:宏程序定义中不能出现数据行、
datalin
es
等。
宏程序提交之后,编译过的
宏存放在
r
中。
一些保留词不能用作宏名,详见
P537
。
例
1
01
/* Programs_
*/
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 2
13
4 1 2 2 1
14
3 5 1 2 1
15
2 3 3 1 2
16
3 3 3 4 5
17
;
18
%mac_pgm
19
DATA out2;
20
INPUT var_a$$ @@;
21
DATALINES;
22
3 1 1 2 1
23
2 1 1 3 3
24
2 1 5 3 2
25
4 5 4 5 1
26
3 1 3 1 2
27
;
28
%mac_pgm
例
2
宏变量与宏程序可结合使用
01
* Program_10-3-1_ */
02
%let
dsn=out1;
03
%let yvar=Income;
04
%let xvar=Age;
05
%macro plot;
06
Proc plot;
07
plot &yvar*&xvar;
08
run;