嗯,最近在学习宏真得有点难度,不过似乎现在大体系统了解了这块知识,所以,就今晚进行一个整理归纳~

一、宏功能

1)可以降低重复性任务的工作量,便于重复调用。

2)使程序模块化,同时便于修改宏参数,而无需重新运行,可以大幅提高运行效率。

二、宏变量

无论在哪一个语言中,变量的地位是毋庸置疑的,在sas宏也是如此。

2.1 宏定义

定义宏的方法主要有三,分别是let定义、data步定义以及sql步定义

1)%LET定义

%let myname=LGD;

%put "My name is &myname.";

输出:"My name is LGD"

2)data步定义

语法过程:call symput("宏变量名",值);

语法过程:call symputx(“宏变量名”,值,宏变量作用域);

data _null_;

set sashelp.class(obs=6 firstobs=6);

call symput('myname',name);

call symput('myage',age);

run;

%put "My name is &myname Bond, I'm &myage years old.";

输出:"My name is James    Bond, I'm           12 years old."

data _null_;

set sashelp.class(obs=6 firstobs=6);

call symputx('myname',name);

call symputx('myage',age);run;

%put "My name is &myname Bond, I'm &myage years old.";

输出:"My name is James Bond, I'm 12 years old."

可以看出,symput输出的结果中会存在很多的空格,到底为什么会产生我还要研究,但是symputx输出的结果就是把多余的空格都去掉的。

3)SQL过程中定义

语法过程为:

proc sql noprint;

select name,sex into: myname,:mysex

from sashelp.class(firstobs=1 obs=1);

quit;

%put "Name is &myname, Sex is &mysex .";

输出:"Name is Alfred  , Sex is M ."

2.2 宏显示

主要就是用%put语句显示宏变量

语法格式:%put <TEXT | _ALL_ | _AUTOMATIC_ | _GLOBAL_ | _LOCAL_ | _USER_>;

2.3 宏引用

而关于宏的引用,主要分3类,分别为直接引用、间接引用和隔开引用

1)直接引用

这个直接引用有3点需要注意,分别有三个例子。

%let x=30;

data a;

x=&x.;*带后缀句点会更加安全;

run;

%let x=30;

data a;

x="It's &x.";*带引号的文本中引用宏变量,必须使用双引号;

run;

%let 区域=%nrstr(华东&华南);*若引用内容存在&符号,则需要用到nrstr;

%put &区域.;

2)间接引用

顾名思义就是通过一些过程之后才引用宏函数,其实最常见的就是在宏名称那里大搞动作,sas宏中就有一个机制,就是&&&运行一次,会变成&&,再运行一次会变成&,大家还是看下例子。

%let app1=A001;

%let app2=A002;

%let app3=A003;

%let i=2;

%put &&app&i;

输出:A002

可以看出,第一次运行的时候,&&变成&,&i变成2,然后就重新组合成&app2,然后就调用返回A002

3)隔开引用

这个炒鸡建议大家使用,就是在你引用宏变量名称的时候,默认在后面加上个”. ”,这样子会避免很多问题。大家可以从下面的例子中看出:

%let myvar=here;

%put &myvar100;

%put &myvar.100;

输出:

WARNING: 没有解析符号引用 MYVAR100。*明显,没有用逗号隔开的,系统会默认是一个整体,所以把myvar100看出一个整体,然而这个宏并没有被定义,所以就调用失败;

here100*这个为正确示范;

所以还是建议大家在引用宏的时候,在最后加上一个逗号来隔开后面的内容。

三、宏函数

3.1 定义宏

3.2 调用宏

调用宏很简单,就是以“%macro_name;”格式来调用宏程序,但调用前,要先运行一次宏程序。

3.3 宏参数

宏参数用的机会是很多的,宏参数创建的方式主要有2种。一种是按值创建,另一种是按地址创建。

1)按值创建宏参数

当参数超过一个时,参数的位置可以任意放

%macro t(name=,age=);

data _null_;

put "I'm &name, I'm &age years old.";

run;

%mend;

%t(name=yy,age=20);

%t(age=20,name=yy);

输出结果(2个都一样的):I'm yy, I'm 20 years old.

2)按地址创建宏参数

参数的位置要按宏定义的位置放

%macro t(name,age);

data t;

name="&name";

age=&age;

put "I'm &name, I'm &age years old.";

run;

%mend;

%t(yy,20);

%t(20,yy);

输出结果:I'm yy, I'm 20years old.

I'm 20, I'm yy years old.

可以看出,你输入的变量需要按照顺序来,不然的话就会出现预想之外的结果。

3.4 通配函数

通配函数是指能够在SAS宏中使用data步的函数,最常用的通配函数是%SYSFUNC函数。

语法格式:%sysfunc(function(argument(s))<,format>);

例子:

*Fromat应用;

%put today is %sysfunc(putn('11oct2015'd,yymmdd10.));

*判断数据集是否存在;

%put %sysfunc(exist(work.aaa_4));

3.5 计算函数

宏计算函数有两个,均可计算算术和逻辑表达式

1)%EVAL函数:整数格式计算

语法格式:%EVAL (arithmetic or logical expression)

%let a=3+2;

%put %eval(&a);*返回5;

%put %eval(3+2);*返回5;

%put %eval(3.1+2);*如果是带有小数的计算,将会报错;

%put %eval(10/3);*如果是做除法运算,结果只会保留整数;

2)%SYSEVAL函数:浮点格式计算

语法格式:%SYSEVAL(expression<, conversion-type>)

conversion-type包括下表所示内容:

*boolean;

%put %sysevalf(1/3,boolean);      /* returns 1 */

%put %sysevalf(10+.,boolean);     /* returns 0 */

*ceil;

%put %sysevalf(1 + 1.1,ceil);       /* returns  3 */

*floor;

%put %sysevalf(-2.4,floor);         /* returns -3 */

*integer;

%put %sysevalf(2.1,integer);        /* returns  2 */

%put %sysevalf(-2.4,integer);       /* returns -2 */

四、宏语句

其实和我们平时在data步中使用的函数差不多,只不过都加了特殊标志%,常用的语句如下所示:

4.1 %if-%then /%else语句

语法格式:%IF expression %THEN action;

%ELSE action;

%macro t(workday=);

%if &workday=1 %then %do;

%workmacro;

%end;

%else %do;

%put 今天休息,不运行程序;

%end;

%mend;

4.2 %do循环语句

语法格式:

%do start %to stop<%by increment>;

文本及宏语句;

%end;

%macro t(n=);

%do i=1 %to &n;

proc append base=basedata data=newdata&i.;run;quit;

%end;

%mend;

4.3 %do %while循环语句:条件为真时执行

语法格式:

%do %while(expression);

文本及宏语句;

%end;

%macro t(n=);

%let i=1;

%do %while (&i<=&n);

proc append base=basedata data=newdata&i.;run;quit;

%let i=%eval(&i+1);

%end;

%mend;

4.4 %do %until循环语句:条件为真时结束执行

语法格式:

%do %until(expression);

文本及宏语句;

%end;

%macro t(n=);

%let i=1;

%do %until(&i>&n);

proc append base=basedata data=newdata&i.;run;quit;

%let i=%eval(&i+1);

%end;

%mend;

以上是对sas宏比较常用的内容进行系统的梳理,当然有很多内容是忽略了的,sas宏的理论知识讲太多的话其实也记不得多少呢,所以未来2天我会post几个关于sas宏的案例,一遍解析思路和sas宏的实际应用,敬请期待~嘻嘻!

#SAS进阶-SAS宏介绍相关推荐

  1. 服务器硬盘SAS与SATA区别介绍

    服务器硬盘SAS与SATA区别介绍SAS硬盘与SATA硬盘: 串行技术 - 包括SAS硬盘(串行连接SCSI)和SATA硬盘(串行ATA)- 比旧款的Intel Xeon服务器有了更好的RAS性能.当 ...

  2. SAS的基本使用介绍2(变量的输入输出格式)

    前言 有关SAS的基础使用可以回看上一篇 SAS的基本使用介绍1(数据集建立与输入输出格式) 本文将继续介绍SAS基本使用 自定义格式 SAS的灵活之处在于可自定义输入输出 例如:在输入性别时,输入1 ...

  3. SAS(二)SAS基本数据类型及SAS基本模块的介绍

    SAS(二)SAS基本数据类型及SAS基本模块的介绍 SAS基本介绍 SAS 是英文Statistical Analysis System的缩写,翻译成汉语是统计分析系统,最初由美国北卡罗来纳州立大学 ...

  4. 017.Zabbix宏介绍

    一 宏介绍 Zabbix宏的作用是便于在模板.Items.Trigger中的引用,名称为{$名称},宏的字符范围为:A~Z/0~9/_. 如:net.tcp.service[ssh,{$SSH_POR ...

  5. Java通SAS下载sas脚本

    Java通SAS下载sas脚本 简述 配置workspace和配置libname信息 下载文件 简述 书接上回,有时候需要将执行好的sas数据库文件对外提供,实际程序和sas不在同一台服务器上,不想挂 ...

  6. SAS语言与算法介绍

    SAS语言是一种用于数据分析和统计建模的程序设计语言,由美国SAS Institute公司开发.SAS语言不仅可以进行数据的读取.处理.分析和报告,还可以进行数据挖掘.机器学习.人工智能等领域的应用. ...

  7. SAS的数组array介绍

    SAS可以把一组同为数值型或同为字符型的变量合在一起,使用同一个名字称呼,用下标来区分.这与通常的程序设计语言中的数组略有区别,通常的程序设计语言中数组元素没有对应的变量名,而SAS数组每个元素都有自 ...

  8. SAS的基本使用介绍1(数据集建立与输入输出格式)

    SAS的基本使用 提前说明:本软件安装较为复杂,而且所占空间很大 运行helloworld Data a; File print; Put 'hello world!'; Run; Proc prin ...

  9. python 访问sas 逻辑库,SAS | 逻辑库和SAS数据集

    [TOC] 1 临时和永久数据集 SAS数据集名称 SAS数据集有临时和永久两种存在方式.所有的SAS数据集都有一个两级名称,两个层级之间用句点.分隔. 第一层级:逻辑库引用名 第二层级:数据集名称 ...

最新文章

  1. 深圳python培训比较好的机构-深圳十大python培训机构排名
  2. flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...
  3. keras从入门到放弃(四)多分类问题
  4. 数学建模清风第一次直播:传染病模型和微分方程拟合
  5. .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
  6. c语言double root,C语言修仙
  7. html GPS坐标实现,JavaScript 实现GPS坐标点距离计算(两个经/纬度间的距离计算)...
  8. [RL] 配置 gym 与 atari 游戏
  9. [转载] 机器学习 - 如何使用 Java 调取 Python、R 的训练模型?
  10. 一步步开发自己的博客 .NET版(3、注册登录功能)
  11. 登陆服务器老出现“达到最大连接数解决方法
  12. RTMP vs RTMFP
  13. 一般处理程序里使用session对象为null,未将对象引用到实例化
  14. javacv获取摄像头列表
  15. 地图切图 java_多任务切图 | SuperMap iDesktop Java
  16. 数字转为人民币大写汉字输出(大力看了都喊nb的详细教程)
  17. 初等变换和阶梯矩阵【】
  18. 从再生龙(clonezilla)镜像直接提取文件
  19. OpenSSL文档阅读笔记-RSA Encryption Decryption Example with OpenSSL in C
  20. 压缩气体储能领域新势力「嘉泰新能」获AC资本天使轮投资!

热门文章

  1. 基于N32G45的按键驱动
  2. 山东专利申请快速通道流程
  3. 8款数据迁移工具选型,主流且实用
  4. Legend并列调整
  5. HDU4218 IMBA?
  6. 阿里Java诊断工具 arthas - 监测线上系统的运行信息、排查程序运行缓慢等问题
  7. 2019浙大计算机考研经验贴
  8. 2020福布斯中国富豪榜公布前20
  9. 图解MySQL页分裂
  10. Ubuntu桌面入门指南