在说正文前,小编还是要插播一下小编今年的一次面试经历。今年,小编去5家公司面试了,恩,从5月份开始,差不多一个月去一家公司面试,前俩家被拒,后三家都拿到offer了。
面了这么多次试,大多数面试都只是谈一下工作“心得”,面试官真正的”SAS技术”的面试也就1家,
把我虐的觉得以前写SAS都写到狗身上了,为啥小编这么觉得呢,因为面试官问了关于Macro调试的几个问题。小编都表述不出来了。虽然最后面试过了也拿到了offer,但是小编还是深刻的认识到自己Macro技能的匮乏,不会那几个option小编都不太好意思说自己会写Macro。
本文由“壹伴编辑器”提供技术支持
1
%goto语句
%goto语句的使用:需要写封闭的Macro代码里面,可以实现语句的跳转
1.且看下方代码,预测一下Log会显示什么?
%macro test;
%put NOTE:开始执行!;
%let flag=1;
%if &flag=1%then%goto exe;
%put NOTE:执行到这儿了~???;
%exe:
%put NOTE:执行结束!;
%mend;
%test
Log:
有没有疑问为什么没有执行Log第53行代码(哦,对了,解释一下为啥我 %put 的时候喜欢加 NOTE:这样的字样,因为加上的的话%put的内容就是绿色的字体了,如果没有NOTE:则是黑色的自己,纯属个人喜好,因为有颜色的字体比较容易引起视觉的关注,也推荐大家写Macro的时候要把一句话%put的Log上的时候加上Note:)。
还是说重点,为啥没有执行53行代码呢,因为有%goto语句,如码所示,在%if语句条件为真的时候则执行了%goto exe(这儿的%if 和条件可以不写, 可以将第50行代码,直接换成 %goto exe;);这个时候SAS会直接跳转到 %exe: 后面,执行后面的代码了。如果我们用%goto语句,会非常方便我们分段调试SAS Macro。它的使用不仅局限在调试的时候使用,在marco中也可以用,但满足一定条件的时候我想直接退出Macro的执行啊,等等。
2
SAS MACRO OPTIONS
调试的option小编还是先用一段代码和一张截图来说明问题。
code:
option mprint symbolgen mlogic mfile;
option notes;
%macro loop(loop);
%do i=1%to &loop. ;
%if &i.=1%then%do;
%put NOTE:圣诞快乐~ (执行第&i.此循环);
%end;
%if &i.=2%then%do;
%put NOTE:圣诞快乐~ (执行第&i.此循环);
%end;
%if &i.=3%then%do;
%put NOTE:圣诞快乐~ (执行第&i.此循环);
%end;
%end;
%mend;
%loop(3);
log:
看日志,有没有发现和大家平时的log不一样,这个日志可以看到很多信息,Macro是怎么运行的,每一步宏变量的值,每一个判断语句是否为成立,等等信息。这些全是通过Option选项实现的。
option mprint symbolgen mlogic mfile;是这四个option,此处主要是(symbolgen mlogic )这俩个Option控制的,如日志,每一句log前独有说明。
这些主要是在调试的时候使用,当Macro调试完成后,我们得关掉这些Option,为啥要关掉了,因为option打开了会严重影响Macro的运行速度。如何关闭Option呢,很简单在每个前面加no就行了。好吧,调试小编暂时用到的也就这些,可能不算很多,也不全,如果各位看客有要补充的可以留言(万谢!),分享使人快乐,千万不要藏着掖着!
本文由“壹伴编辑器”提供技术支持
另外补充一个SAS执行好的Macro文件如何调用:(Macro执行的后的文件是一个黄黄的小文件(sasmacr.sas7bcat))
%let MAC=E:macroother;
libname MAC "&MacPath";
Options MAuto Source MStored SASMStore=MAC;
今天的内容有点少,咦,真的有点少,好吧为了凑字数,小编说点别的,SUM的函数的另类用法。
1
SUM函数常规写法
SUM不就是求和么?是,SUM是求和。先来看常
结果:
在data步中的SUM函数的使用,求多个变量的和针对行(见y变量的生成)。在proc sql中的应用,可以求行之和(见yy变量的生成),也求列的和(见yyy变量的生成)。好吧,这都是常规的用法。
2
SUM非常规写法
SAS中的”布尔类型”:真(1),假(0)
预测一下此时a数据集中Z的值?
在sum函数中写条件,如果满足条件则返回1,不满足则返回0,在实际编程中有什么用途呢,一定用的上,而且针对一些特殊问题,解决起来是非常便捷的。
小编就进举一例:比如,我有20个条件,只要满足其中任意5个,则筛选出来,这个时候就可以用 sum(20个条件)>5 去实现.... 好了,很多函数都有类似这样的功能,大家可以去尝试,我就不一一列举了,其实小编也没有尝试其他函数,因为小编觉得SUM函数现在已经够我解决很多问题了。函数的话,小编以后会继续分享的,因为小编最近在研究自定义函数,等小编学会了,一并给大家分享