在今天SAS编程中,运行了宏程序进行循环批量处理。程序没有Error和Warning,但是宏循环只运行1次,就结束了。花了不短的时间去解决这个问题,原因很简单。
宏程序是一段具体的、模块化的SAS程序,它方便我们重复使用某一段程序,简化了程序,也提高了效率。
一般宏程序是为了某个具体的功能而编写,如果这个具体功能的实现过程稍微复杂一点,宏程序的编写也会涉及其他宏程序的调用,即产生了宏程序的嵌套。
举一个具体的例子,数据保存在EXCEL中的一个sheet中,需要将这个数据导入SAS数据集。Sheet中包含了变量名称、变量的Label以及具体的记录,导入时需要针对每一个变量进行属性设置。我们可以先从实现一个变量的属性设置开始,然后通过宏程序中的宏循环去实现所有变量属性的批量设置,这是宏循环的一个思路。
如果这个EXCEL中有多个sheet,它们的格式布局是统一的,也需要导入SAS数据集。由于上一步我们实现了单个sheet的数据导入设置,这一次完全可以对sheet做一个宏循环,在每一个循环中调用上一步的宏程序,实现多个sheet的导入,这个宏程序嵌套的思路。
我的问题就出现在宏嵌套的循环上。
出于习惯,宏循环的计数变量我一般选i
,但是这两个宏程序的循环我都用了i
。于是,在大的循环第1次运行时,i=1
;在这个循环中,程序又调用了另一个宏循环,i
从1开始,循环至条件之外,小循环结束;这时候,i
的值也在大的循环条件之外,大的循环也结束。这就是我的嵌套宏循环的大循环只运行一次的原因。
解决方法很简单,两个宏循环的计数变量名称设置成不同就可以,我把第2个变量命名成ii
。
这个问题我之前遇到过,但由于没有明显的Error和Warning,这次一下子也没有想到缘由。
对于一般的宏程序的编程以及调试问题,可以通过阅读宏程序源码或者查看宏程序运行程序来解决,可以参考SAS编程:检查宏程序issue思路介绍 。
希望这篇文章对读者SAS宏程序编程有帮助。
感谢阅读!若有疑问,欢迎评论区交流!
网友评论