SAS编程技巧之SAS宏变量定义的三种方式
的有关信息介绍如下:
宏变量定义的三种方式
说到Macro,那么就不得不说宏变量,宏变量的是啥呢?可以理解成和其它编程语言中的变量一样,在内存中创建了一个空间(给这个空间一个标记,宏变量的名称),然后将一些值放到这个内存空间中(这就是定义宏变量的过程),好吧,我是一个不善解释的人,没理解的还是自行百度领悟。那么就来看看如何来定义Macro变量。
3SAS9.4下载安装教程SID续订更新(2019年01月)
第一种:
%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,:_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....*/selectname 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;



