多语言展示
当前在线:634今日阅读:61今日分享:18

SAS编程技巧之SAS宏变量定义的三种方式

宏变量定义的三种方式说到Macro,那么就不得不说宏变量,宏变量的是啥呢?可以理解成和其它编程语言中的变量一样,在内存中创建了一个空间(给这个空间一个标记,宏变量的名称),然后将一些值放到这个内存空间中(这就是定义宏变量的过程),好吧,我是一个不善解释的人,没理解的还是自行百度领悟。那么就来看看如何来定义Macro变量。3SAS9.4下载安装教程SID续订更新(2019年01月)
工具/原料
1

SAS9.4

2

SAS Macro

方法/步骤
1

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

2

CALL SYMPUTCALL 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 这种方式还是一句话:特别好用,当然也有一些局限性..

3

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,:_nvarfrom 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

SAS 宏变量的定义方式

2

SAS Macro

推荐信息