请选择 进入手机版 | 继续访问电脑版
楼主: cashes93
5465 7

[学习分享] 宏变量的定义方式及几种使用技巧自动获取路径 [推广有奖]

  • 1关注
  • 3粉丝

本科生

73%

还不是VIP/贵宾

-

威望
0
论坛币
6 个
通用积分
0.4502
学术水平
3 点
热心指数
6 点
信用等级
3 点
经验
1651 点
帖子
30
精华
0
在线时间
193 小时
注册时间
2016-3-19
最后登录
2024-4-2

cashes93 发表于 2018-2-19 12:32:50 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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;





二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分热心指数 收起 理由
eijuhz + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

扫描我头像....
cashes93 发表于 2018-2-19 12:33:39 |显示全部楼层 |坛友微信交流群
在贴个广告~欢迎扫描我头像...关注微信公众号...

使用道具

cashes93 发表于 2018-2-19 12:34:59 |显示全部楼层 |坛友微信交流群
欢迎扫描我头像....

使用道具

cashes93 发表于 2018-2-19 12:42:34 |显示全部楼层 |坛友微信交流群
资料1.jpg

使用道具

8112mmw 发表于 2018-2-21 10:26:49 来自手机 |显示全部楼层 |坛友微信交流群
很好的帖子,收藏了

使用道具

cashes93 发表于 2018-2-21 19:15:09 |显示全部楼层 |坛友微信交流群
8112mmw 发表于 2018-2-21 10:26
很好的帖子,收藏了
谢谢,更多内容可以关注我公众号~

使用道具

添/jd方 发表于 2018-2-23 22:58:19 |显示全部楼层 |坛友微信交流群
帖子写得不错,收藏了

使用道具

cashes93 发表于 2018-2-23 23:00:11 来自手机 |显示全部楼层 |坛友微信交流群
添/jd方 发表于 2018-2-23 22:58
帖子写得不错,收藏了
谢谢肯定~

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-18 23:11