首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS-Macro 中的那些语句(一)

SAS-Macro 中的那些语句(一)

作者头像
Setup
发布2019-10-21 17:29:25
2.2K0
发布2019-10-21 17:29:25
举报
Macro是SAS编程不可缺少的一部分,Macro的好处很多(此处省略若干字),当然这也是接着前面的基础篇写的~这也是一个Macro中的基础篇。

宏变量定义的三种方式

说到Macro,那么就不得不说宏变量,宏变量的是啥呢?可以理解成和其它编程语言中的变量一样,在内存中创建了一个空间(给这个空间一个标记,宏变量的名称),然后将一些值放到这个内存空间中(这就是定义宏变量的过程),好吧,我是一个不善解释的人,没理解的还是自行百度领悟。那么就来看看如何来定义Macro变量。

%LET

%let 方式定义宏变量:这个是最简单、最直接的赋值定义的方式.

将值直接赋值给宏变量....那么来看一个简单的例子.

%let macvar1=2018,wo hai shi yi ge dan shen dog;
%put NOTE:宏变量macvar1的值是:&macvar1.;

见上面的这个例子,小编将一句话直接赋值给宏变量,通过%put见下面一句话打印到日志,这个时候通过解析符号来解析定义的Macro变量。来看看日志的是什么样的...

看蓝色部分的哪一行话,&macvar1那个地方已经别替换了...显示的是宏变量的值....

那么在实际编程中,%let方式定义宏变量用的多么,答案是显然的多!最常用的的场景之一就是定义路径.在每个项目开始编程的第一步,最开始的程序,大概都是Setlib,设置项目夹子/与建立逻辑库,并将路径全部赋值给相应的宏变量,在后续的编程中,如果有路径的引入,将全部用宏变量去代替,为什么要这么做呢?那就是将项目夹子打包,不管移动到任何地方,无需人工修改程序内部路径,就可以直接运行程序了...当然好处不仅仅如此,接下来小编将举出一个自动获取路径,建立逻辑库的方式...

%macro setups;
%global PATH PGMLIB PROJECT;
%LET CURRENTROOT= %upcase(%sysget(sas_execfilepath));
%LET PGMLIB=%upcase(%sysfunc(substr(&CURRENTROOT.,1,%index(%sysget(sas_execfilepath),\%sysget(sas_execfilename)))));
%PUT NOTE:&CURRENTROOT.;
%PUT NOTE:&PGMLIB.;
Libname dblib "&PGMLIB.";
%mend;
%setups;
%macro setup;
%GLOBAL SETUP PGMLIB PATH PROJECT;
%LET SETUP= %upcase(%sysget(sas_execfilepath));
%LET PGMLIB=%sysfunc(prxchange(s/(.*)\\.*/\1/,-1,&SETUP));
%LET PATH=%sysfunc(prxchange(s/(.*)\\.*/\1/,-1,&PGMLIB));
%PUT NOTE:PGMLIB =&pgmlib.;
%PUT NOTE:PATH   =&path.;
Libname dblib1 "&PGMLIB.";

%mend;
%setup;

这俩段代码是等效的,原理是获取当前程序所在的路径,然后针对此路径追溯到前面的几级文件夹,将所需的路径赋值给宏变量,然后在通过调用宏变量去定义逻辑库...在编程的过程中,是可以全程不用手动输入外部路径的....都可以通过宏变量代替,将来项目夹子不管怎么移动,都能直接运行程序的..那么在来看看日志。

CALL SYMPUT

CALL SYMPUT 定义Macro变量

如果想将一个数据集中的观测给赋值给Macro变量,做循环,那么就

可以使用此方式...那么还是举出一个例子..

%macro gtpgm;
filename temp1 pipe "dir E:\macro\*.sas /b"; 
data _null_;
 infile temp1 truncover;
 input fname $char1000.;
 i=_n_;
 call symput('pgmn'||compress(put(_n_,best.)),strip(fname));
 call symput('nobs',strip(Max(I)));
run;
%put NOTE:该路径下一共有&nobs.个sas程序文件,名称如下:;
%do i=1 %to &nobs.;
%put NOTE:第&i.条观测的值:&&pgmn&i.;
%end;
%mend;
%gtpgm;

我这里是将某路径下所有的sas程序名称赋值给宏变量...

实际编程应用中实际是非常广的,比如批量导入excel/csv的时候自动获取文件名称,将文件名称赋值给宏变量,通过循环来实现批量导入导出的操作...

CALL SYMPUT 这种方式还是一句话:特别好用,当然也有一些局限性..最后来说也来看看日志....

PROC SQL INTO:

SQL定义宏变量是特别的好用,可以将一列观测的值赋值给一个宏变量,也可以将观测逐条赋值...应用场景特别广那么就来看看几个简单的例子...

%macro sqlptname;
proc sql noprint;
/*通过数据集字典 dictionary.tables 来获取SASHELP.CLASS数据拥有的观测个数,变量个数,并将其分别赋值给_nobs,_nvar*/
select compress(strip(put(nobs,best.))),compress(strip(put(nvar,best.))) into :_nobs,:_nvar
from dictionary.tables where libname=upcase("sashelp") and memname=upcase("class");
/*SASHELP.VCOLUMN里面存储了很多信息... 这里是将SASHELP.CLASS中的变量名以空格连接起来赋值给宏变量 varlist*/
select NAME into:varlist separated by "   " 
from sashelp.vcolumn where libname=upcase("sashelp") and memname=upcase("class");
/*这里将SASHELP.CLASS数据集中的NAME列的记录,逐条赋值给宏变量 NAME1 NAME2....*/
select  name into: name1-:name%left(&_nobs.) 
from sashelp.class;
quit;
/*在日志显示宏变量的值*/
%put NOTE:SASHELP一共有记录:%sysfunc(strip(&_nobs.)),变量:%sysfunc(strip(&_nvar.));
%put NOTE:变量分别为:%sysfunc(strip(&varlist.));
%do i=1  %to &_nobs.;
%put NOTE:第&i.条观测的对应的名称为:&&Name&i.;
%end;
%mend;
%sqlptname;

看上面的SQL中定义宏变量,实际是有俩种,有没有发现...没发现的话,在仔细看看,下面来看看日志的...

仔细看了还没发现,那么就来看看小编设置的SQL定义宏变量的快捷方式的代码块(2种)...

proc sql noprint;
select count(distinct name) into: nn from class;
select distinct name into: name1-:name%left(&nn.) 
from Class
;
quit;
proc sql noprint;
select NAME into:varlist separated by "," from _varstemp10   ;
quit;

那么最后来看一张图:

说了这么多宏变量定义的方式,那么还是有几点要注意的,宏变量的长度是有限制的,大概一般人都不知道吧

...我还没有百度出如何解除这个长度限制的办法...如果哪位大神知道,请不吝指点...当然针对这种宏变量长度达到上限的情况,小编是这样实际编程中,在将其拆分成多个宏变量...

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAS程序分享号号号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档