• SAS | macro variables&macro


    宏变量macro variable

    宏变量是SAS宏工具的一部分,该工具用于扩展和定制SAS,并用于减少执行常见任务所必须输入的程序代码量
    automatic macro variables自动宏变量
    SAS创建并定义了一些自动宏变量。自动宏变量包含有关计算机环境的信息,比如会话的时间和日期,以及正在运行的SAS版本等,调用宏变量需要在宏变量名前面加上&
    automatic variables

    /*自动宏变量*/
    
    /*sysscp 目前使用的操作系统的缩写*/
    /*sysver 正在使用的SAS版本*/
    footnote1 "Created &systime &sysday, &sysdate9";
    footnote2 "on the &sysscp system using Release &sysver";
    title "REVENUES FOR DALLAS TRAINING CENTER";
    proc tabulate data=all(keep=location course_title fee);
       where upcase(location)="DALLAS";
             class course_title;
             var fee;
             table course_title=" " all="TOTALS",
                   fee=" "*(n*f=3. sum*f=dollar10.)
                   / rts=30 box="COURSE";/*标签不加任何内容相当于去掉变量名*/
    run;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    user-defined macro variables用户自定义宏变量
    定义格式:

    %let variable=value;

    variable是符合SAS约定的任何名称;value可以是取值范围为0 ~ 65535的任意字符串。
    NOTE:
    1)宏变量自定义的所有值都存储为字符串(此处字符串的含义与string不同,只是表名value是什么,variable的值就是没有,不做任何操作);
    2)不计算数学表达式;
    3)保留值的情况;
    4)括文字的引号作为值的一部分存储;
    5)在复制之前,自动删除值中的前导空格和尾随空格
    调用宏变量要在宏变量名前加上&

    /*用户自定义变量*/
    
    %let site=DALLAS;      /*Boston  Seattle*/
    title "REVENUES FOR &site TRAINING CENTER";
    footnote;
    proc tabulate data=all(keep=location course_title fee);
         where upcase(location)="&site";
         class course_title;
         var fee;
         table course_title=' ' all='TOTALS',
                 fee=' '*(n*f=3. sum*f=dollar10.)
                 / rts=30 box='COURSE';
    run;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    宏macro

    宏能够将少量或大量的文本打包到具有名称的单元中,之后在使用这个文本内容时就可以直接调用宏而不用重复输入该文本,这样不仅减少了程序员的无用功,而且也可以让代码更简洁,维护也更加方便快捷。
    定义一个宏的基本格式:

    %macro macro-name;
    text
    %mend ;

    macro-name定义宏的名称;
    text可以是常量文本,可能包括SAS数据集名称、SAS变量名称或SAS语句;也可以是宏变量、宏函数或宏程序语句。
    调用宏需要在宏名称前加上%
    如果在调用宏时想要查看宏的内容,可以在调用宏的语句前加上一句option mprint;
    宏注释:

    %* comment;

    /*defining a basic macro*/
    %macro prtlast;
    	proc print data=&syslast (obs=5);
    	title "Listing of &syslast data set";
    	run;
    %mend;
    
    
    /*defining a macro with positional parameters*/
    %macro printdsn(dsn,vars);
    	proc print data=&dsn;
    		var &vars;
    		title "Listing of %upcase(&dsn) data set";
    	run;
    %mend;
    
    /*defining a macro with keyword parameters*/
    %macro printdsn(dsn=sasuser.courses,vars=course_code course_title days);
    	proc print data=&dsn;
    		var &vars;
    		title "Listing of %upcase(&dsn) data set";
    	run;
    %mend;
    
    /*using the %if-%then statement*/
    %macro choice(status);
    	data fees;
    		set sasuser.all;
    		%if &status=paid %then %do;
    			where paid='Y';
    			keep student_name course_code begin_date totalfee;
    		%end;
    		%else %do;
    			where paid='N';
    			keep student_name corse_code begin_date totalfee latechg;
    			latechg=fee*1.10;
    		%end;
    		/* add local surcharge */
    		if location='Boston' then totalfee=fee*1.06;
    		else if location='Seattle' then totalfee=fee*1.025;
    		else if location='Dallas' then titalfee=fee*1.05;
    	run;
    %mend choice;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    /*定义一个宏*/
    %macro prtlast;
       proc print data=&syslast (obs=5);
       title "Listing of &syslast data set";
       run;
    %mend;
    
    
    proc sort data=schedule out=schedule;
      by begin_date;
    run;
    
    %prtlast          /*没有分号*/
    
    
    /*也可以在宏中使用注释符号,当这些符号出现时,宏处理器将忽略注释中的文本*/
    %macro printit;
      %* The value of &syslast will be substituted appropriately ;
      %* as long as a data set has been created during this session. ;
      proc print data=&syslast(obs=5);
      /* Print only the first 5 observations */
      title "Last Created Data Set Is &syslast";
      run;
    %mend;
    
    
    proc sort data=schedule out=schedule;
      by begin_date;
    run;
    
    %printit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    【视觉算法系列1】使用 KerasCV YOLOv8 进行红绿灯检测(下)
    传奇世界单机架设
    NLP(14)--文本匹配任务
    微信小程序 - 2023年最新版手机号快捷登录详细教程
    虚拟机Ubuntu
    一个与 WSL2 建立远程的简单方法
    Guava Cache的使用方式
    网络技术八:Vlan和Trunk基础
    66. 加一、Leetcode的Python实现
    mongodump工具安装及使用详解
  • 原文地址:https://blog.csdn.net/qq_43776450/article/details/125552382