SAS宏工具

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软件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值