SAS语法约定
语法组件、样式约定、特殊字符、SAS库的引用和外部文件
语法组件
样式约定
特殊字符
SAS库的引用和外部文件
语法组件:
关键字
CHAR (string,position)
CALL RANBIN (seed,n,p,x)
ALTER (alter-password)
BEST w.
REMOVE <data-set-name>
不带参数的关键字
DO;
...SAS code...
END;
某些系统选项要求指定以下两个关键字值之一:
DUPLEX | NODUPLEX
某些过程语句在整个语句语法中有多个关键字:
CREATE <UNIQUE> INDEX index-name ON table-name (column-1<,column2,...>)
指定数值或字符常量、变量或表达式。参数跟在关键字后面,或在关键字后面加一个等号。SAS使用这些参数来处理语言元素。参数可以是必需的,也可以是可选的。在语法中,可选参数被括在尖括号(<>)中。
宏的组成部分:宏处理器和宏语言。
当SAS编译项目文本,两个分隔符出发宏处理器活动:
&name:name指宏变量
%name:name指宏
注:有三个SAS语句以%开头,但它们不属于宏功能的一部分。这些元素是SAS DATA步骤语句引用中的%INCLUDE、%LIST和%RUN语句。
如何定义宏变量
使用宏变量替换文本字符串:
使用%LET语句为全局宏变量分配一个名称(遵循标准SAS命名约定)和一个值。
/*使用%LET语句为宏变量分配一个名称(遵循标准SAS命名约定)和一个值。*/
%let city=New Orleans;
/*您可以在希望文本New Orleans出现的SAS语句中使用宏变量CITY。*/
title "Data for &city";
/*宏处理器解析对宏变量CITY的引用结果:*/
title "Data for New Orleans";
注:宏变量可以定义在宏定义内,也可以定义在位于宏定义外的语句内(称为开放代码)。
开放代码中的%LET语句(在宏定义之外)会创建一个全局宏变量(global macro variable),该变量可在创建变量的SAS会话期间在SAS代码中的任何位置使用(DATALINES或CARDS语句除外)。还有一些局部宏变量(local macro variables)(%local macro_variable_name;),这些变量只能在创建它们的宏定义中使用。局部宏变量仅存在于创建变量的宏的执行过程中,在定义宏之外没有任何意义。
宏变量不受与SAS数据集相同变量的长度限制。要分配给宏变量的值可以包含某些特殊字符(例如,分号、引号、与号和百分号)或助记符(例如,and、or或LT),必须使用宏引用函数来屏蔽特殊字符。否则,特殊字符或助记符可能会被宏处理器误解。有关详细信息,请参见宏报价。
宏变量对于简单的文本替换非常有用。它们不能执行条件运算、DO循环和其他更复杂的任务。对于这种类型的工作,必须定义一个宏。
如何定义宏
宏使您能够替换程序中的文本并执行许多其他操作。SAS程序可以包含任意数量的宏,并且您可以在单个程序中多次调用宏。
每个宏都不能重名。为宏选择名称时,避免使用SAS语言关键字或调用子例程名称。宏名称受标准SAS命名约定的约束。宏名称不能包含双字节字符集(DBCS)字符。宏定义位于%macro语句和%MEND(宏结束)语句之间,如下例所示:
%MACRO macro-name;
%MEND macro-name;
%MEND语句中指定的宏名称必须与%MACRO语句中指定了的宏名称匹配。
/*定义一个名称为dsn的SAS宏*/
%macro dsn;
Newdata *Newdata是宏的文本*
%mend dsn;
宏中的字符串被称为常量文本或模型文本,因为它是成为SAS程序一部分的文本的模型或模式。
调用宏名称:
/*要调用(或调用)宏,请在宏名称前面加一个百分号(%),不需要以分号结尾*/
%macro-name
调用宏名称例子:
title "Display of Data Set %dsn";
/*宏处理器执行宏DSN,它将宏中的常量文本替换为TITLE语句*/
title "Display of Data Set Newdata";
上述例子标题用双引号括起来。在开放代码中带引号的字符串中,宏处理器解析双引号内的宏调用,但不解析单引号内的调用。
因此,在这种情况下,宏观方法与宏观变量方法相比没有任何优势。然而,DSN是一个极其简单的宏。宏可以比宏DSN做得更多。
在宏中插入注释:
所有代码都得益于彻底的注释,宏代码也不例外。有两种类型的注释可用于向宏代码添加注释:PL/1-样式注释和宏样式注释。PL/1风格的注释以/*开头,以*/结尾。PL/1风格的注释通常用于SAS代码中。宏样式注释以%*开头,以分号(;)结尾。
%macro comment;
/* Here is a PL/1-style(Programming Language 1) comment used in other SAS code. */
%let myvar=abc;
%* Here is a macro-style comment.;
%let myvar2=xyz;
%mend comment;
包含几个SAS语句的宏定义:
/*可以创建包含整个SAS程序部分的宏:*/
%macro plot;
proc plot;
plot income*age;
run;
%mend plot;
/*稍后在程序中可以调用宏:*/
data temp;
set in.permdata;
if age>=20;
run;
%plot
proc print;
run;
/*当执行这些语句时,将生成以下程序:*/
data temp;
set in.permdata;
if age>=20;
run;
proc plot;
plot income*age;
run;
proc print;
run;
使用参数将信息传递到宏
/*%macro语句中括号中定义的宏变量是宏参数。宏参数使您能够将信息传递到宏中。例子:*/
%macro plot(yvar= ,xvar= );
proc plot;
plot &yvar*&xvar;
run;
%mend plot;
/*可以通过提供参数值来调用宏:*/
%plot(yvar=income,xvar=age)
%plot(yvar=income,xvar=yrs_educ)
/*执行宏时,宏处理器将宏调用中指定的值与宏定义中的参数相匹配。(这种类型的参数称为关键字参数。)
宏执行会生成以下代码:*/
proc plot;
plot income*age;
run;
proc plot;
plot income*yrs_educ;
run;
有条件地生成SAS代码
通过使用%IF-%THEN-%ELSE宏语句,可以有条件地使用宏生成SAS代码。请参见以下示例:
%macro whatstep(info=,mydata=);
%if &info=print %then
%do;
proc print data=&mydata;
run;
%end;
%else %if &info=report %then
%do;
options nodate nonumber ps=18 ls=70 fmtsearch=(Sasuser);
proc report data=&mydata nowd;
column manager dept sales;
where sector='se';
format manager $mgrfmt. dept $deptfmt. sales dollar11.2;
title 'Sales for the Southeast Sector';
run;
%end;
%mend whatstep;
/*调用SAS宏*/
%whatstep(info=print,mydata=grocery)
/*这段代码将生成以下语句*/
proc print data=grocery;
run;
注:由于宏处理器中的值区分大小写,如果指定PRINT而不是打印,则上一个程序将不起作用。要使宏更加健壮,请使用%UPCASE宏函数。
宏技术的更多优势
使用%DO循环生成重复的文本片段
/*宏NAMES通过连接参数NAME的值和宏变量N的值来创建一系列名称。*/
%macro names(name= ,number= );
%do n=1 %to &number;
&name&n
%end;
%mend names;
/*提供N的停止值作为参数NUMBER的值,如以下DATA语句所示:*/
data %names(name=dsn,number=5);
/*生成以下代码,创建了5个数据集*/
data dsn1 dsn2 dsn3 dsn4 dsn5;
还可以使用%DO%WHILE和%DO%UNTIL语句有条件地执行%DO循环。
为宏变量引用生成后缀
假设,当生成一系列编号的名称时,希望将字母X放在前缀和数字之间。宏NAMESX可以在提供的前缀后面插入一个X:
%macro namesx(name=,number=);
%do n=1 %to &number;
&name.x&n /*句点是引用&NAME末尾的分隔符,宏处理器使用分隔符来区分后面跟着字母X的引用&NAME和引用&NAMEX*/
%end;
%mend namesx;
/*调用namesx宏*/
data %namesx(name=dsn,number=3);
/*提交此声明会产生以下声明:*/
data dsnx1 dsnx2 dsnx3;
宏语言的其他特征
宏语句
存在许多其他宏语句。其中一些语句在开放代码中有效,而另一些语句仅在宏定义中有效。对于宏语句的完整列表。
宏函数
有两个特殊的宏函数%SYSFUNC和%QSYSFUNC,它们提供对SAS语言函数或使用SAS/TOOLKIT生成的用户编写函数的访问。您可以将%SYSFUNC和%QSYSFUNC与Base SAS软件中的新功能一起使用,以获得SAS主机、Base或图形选项的值。
自动调用宏
自动调用宏是SAS定义的宏,用于执行以下常见任务:
修剪引线、宏变量值的尾部空格、返回值的数据类型
宏工具接口
DATA步骤、SCL代码、SQL过程、SAS/CONNECT软件