专栏首页SAS程序分享号号号SAS-Macro 中的那些语句(三)

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

前面说了宏变量相关的,那么今天就来说几个宏中的关键字,判断语句,跳转语句,退出语句,循环语句...

%if语句

不管是在data步中,还是在宏中,都是会有条件判断,在data步中有if ...then ...在宏中也是有该语句的,不过得加上%号,那就是 %if ....%then ...还是先来看一段代码,来看看宏中的%if语句...

%macro  test(msg);
%put NOTE:%superq(msg);
%if %superq(msg) eq 你真美! %then %do;
%put NOTE:You are beautiful;
%end;
%else %if %superq(msg) eq 我真丑! %then %do;
%put NOTE:%str(I%'m ugly);
%end;
%else %do;
%put NOTE:ND;
%end;
%mend;

%test(你真美!);
%test(我真丑!);
%test();

很简单的,其实和data步中是一样的,只是关键词前加了%符号...那么在来看看日志的结果...

%if中的误区:如果是宏变量进行判断的时候,一般习惯写成,%if &msg. eq "你真美!"...这个时候是会有错误的,如果一边有引号,另外一边也需要引号,如果没有那么就都不要双引号..%if "&msg." eq "你真美!"; %if &msg. eq 你真美!

%put NOTE:%str(I%'m ugly);这里的%是什么含义?这里的%是转义符号,用来平衡后的'符号。。说到这里,那么SAS宏中是否可以用IN语句呢...是可以的,得加一个option设置一下

option minoperator mindelimiter=',';
%macro  test(msg);
%put NOTE:%superq(msg);
%if %superq(msg) IN (你真美!,美,好看) %then %do;
%put NOTE:You are beautiful;
%end;
%else %do;
%put NOTE:ND;
%end;
%mend;
%test(你真美!);
%test(美);
%test(好看);

黑色部分的第一行代码就是控制这个的...mindelimiter=','表示 in后面括号内用此符号间隔开来...

%RETURN语句

写Macro的时候的,经常会输入一些参数,有时候会对输入的参数进行check避免输入的参数不合适,而继续执行程序,造成错误耽误时间等...因此在宏中常自动检测参数是否合适,不合适就跳出当前宏的执行...

/*比如:对输入的数据集进行检测,如果该数据集不存在则退出当前执行*/
%macro  test(inds);
%if %sysfunc(exist(%superq(inds))) eq 0  %then  %do;
%put NOTE:你输出数据集(%superq(inds))不存在...请核查!;
%return;
%end;
%put NOTE:你输出数据集(%superq(inds))不存在,该宏继续执行...;
%mend;
%test(a);
%test(SASHELP.CLASS);

来看看日志:

这里如果尝试 %let ss=sashelp.class; %test(&ss.)..猜一猜会有什么效果..这个大概是过俩天的要写的,也可能不写了...

%GOTO语句

很多时候也并不需要直接跳出宏的,而是满足一定条件,

直接跳到后面的某处开始执行....

经常会遇到,如果已有的数据满足某条件,就不需要经过加工...

如果不满足,则进行加工一步....下面看一个丑与美的例子~

option minoperator mindelimiter=',';
%macro  test(msg);
%if &msg. in  (美,好看) %then %do;
%goto flag;
%end;

%put NOTE:%str(你以前很丑,自从你去过某国回来后....);

%flag:
%put NOTE:You are beautiful;

%mend;
/*美的时候,则不需要整容*/
%test(美);
/*丑的时候,则需要整容*/
%test(丑);

上面的代码...执行后的日志会是怎么样的呢...接下来看一下日志

%do %while循环语句

SAS中的循环: (%do %while语句)

%do %while(true);

执行里面的内容;

%end;

否者就执行后面的... (先判断在执行)

下面来看一个例子,也是写宏中比较常见的一种定义宏参数的方式,通过一个宏参数....

%macro test;
%let dslist=ds1\sheetname1\contents1\title1|ds2\sheetname2\contents2\title2|ds3\sheetname3\contents3\title3;
%let i=1;
%do %while(%qscan(&dslist,&i,|)^=%str());
  %let list&i=%qscan(&dslist,&i,|);
  %let dsn&i=%qscan(&&list&i.,1,\);
  %let sht&i=%qscan(&&list&i.,2,\);
  %let cnt&i=%qscan(&&list&i.,3,\);
  %let tle&i=%qscan(&&list&i.,4,\);
  %put NOTE:循环次数(&i.) &&dsn&i &&sht&i &&cnt&i &&tle&i;
  %let i=%eval(&i+1);
%end;    
  %let _loop=%eval(&i-1);
%mend;
%test

那么来看看日志:(这部分来源于小编以前写的一个宏:Macro-Ods Excel Output

这个例子可能不太能够简洁的看%do %while的结果...

%macro test;
%let i=1;
%do %while(&i. le 5);
  %put NOTE:循环次数(&i.) 你真美!;
  %let i=%eval(&i+1);
%end;    
  %let _loop=%eval(&i-1);
%mend;
%test

在来看看日志:

%do ..%until循环

SAS中的循环:

%do %until(true);

中止执行此处;

%end;

执行此处... (先执行后判断) 此处可以做延时处理措施...小编以前的推送中用过此处做延时处理:SAS- Send email&&Macro-Pyh_file2zip,在来看一个简单的例子..

%macro test;
%let i=1;
%do %until(&i. le 5);
  %put NOTE:循环次数(&i.) 你真美!;
  %let i=%eval(&i+1);
%end;    
%mend;
%test

这里虽然最开始 i=1 小于5 是成立的,但是由于until是先执行后判断,所以还是会输出一个 %put后面的内容...

%do ... %to语句

SAS中的循环:

%do...%to...%by

这个最简单,就不多说了...还是用一个简单的例子来看一看...

%macro test;
%do i=1 %to 4 %by 2;
%put NOTE: i= &i.时,你真美!;
%end;
%mend;
%test;

来看一看日志:

今天就这么多了,后续内容,敬请期待~

本文分享自微信公众号 - SAS程序分享号号号(xiaocgn),作者:setup~

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SAS-时药曲线的绘制(完)

    本文是上一篇的推文的续篇,本篇推文将主要介绍GTL绘制受试者维度的时药曲线(画拼图),并分享小编刚出炉的,还热腾腾的自动画图的宏程序。点击

    Setup
  • SAS-Macro 中的那些语句(四)

    大家都知道SAS数据集中的变量是分数值型、字符型的。那么SAS的宏变量是否分数值型变量和字符型变量呢?是不分的,那么宏变量的计算是直接算么?当然是不是的,宏变量...

    Setup
  • SAS-Macro编写调试技巧及相关(Option)

    在说正文前,小编还是要插播一下小编今年的一次面试经历。今年,小编去5家公司面试了,恩,从5月份开始,差不多一个月去一家公司面试,前俩家被拒,后三家都拿到offe...

    Setup
  • 专栏 | 田渊栋:第一届FLAIR感想

    机器之心
  • lnmp1.4 环境升级 php5.5 到 php7 的过程

    魏艾斯博客www.vpsss.net
  • 极客周刊丨谷歌最强AI助手,余额宝不限购回归,传销组织云联惠被查封...

    一川水巷
  • Google新推联合学习:让手机共享一个模型,数据存在本地

    王新民 编译自 Google Research Blog 量子位 报道 | 公众号 QbitAI 传统的机器学习方法需要将训练数据集中到一台机器或一个数据中心里...

    量子位
  • 训练的神经网络不工作?一文带你跨过这37个坑

    选自Medium 作者:Slav Ivanov 机器之心编译 参与:黄小天、Smith 近日,Slav Ivanov 在 Medium 上发表了一篇题为《37 ...

    机器之心
  • 资源 | 神经网络调试手册:从数据集与神经网络说起

    选自Hackernoon 作者:Andrey Nikishaev 机器之心编译 参与:黄小天 近日,hackernoon 上出现了一篇题为《How to deb...

    机器之心
  • 2016年大数据到底还算不算个 “东西” (附2016 大数据版图)

    在喜新厌旧的技术初创企业界,已有 3年 历史 “大数据” 听起来似乎已经过气了。虽然 Hadoop 在 2006年 已经出来,但 “大数据” 这个概念大概是在 ...

    灯塔大数据

扫码关注云+社区

领取腾讯云代金券