太久没有记录了,上次差不多是半年前了。工作之后就太忙了,也抽不出时间来记录。
现在就回来记录一些吧,要学的有些杂,笔记也会记得很杂。
现在有一个任务:有一个表cars,其中的make列有多个汽车品牌,现在依据不同的汽车品牌将表进行拆分,每个子表对应一个类型的汽车。
教学书中的解法:
因为要建多个子表,所以用到了do循环,循环要用到数字1 to n,所以这里先将汽车品牌进行映射
使用proc format的方式进行映射,后面可以直接使用 put(&i , carname.)的方式取出对应的品牌名。
接下来就是使用sas中的do循环来进行循环建表了
和我想的一样,建立一个宏函数,在其中调用do循环和if判断。
这种方法确实可行,但其实有一个巨大的坑,那就是一开始的映射,你三个汽车品牌可以自己挨个写,那如果有30个呢?如果有300个呢?
新的解法:
新的解法使用proc SQL与宏函数结合来解这个问题(毕竟SQL写得习惯了)
首先获得汽车的品牌列表
然后定义宏来拆分表格
这里解释一下这个sysfunc(countw(&car_brands));这一行代码
这个countw的作用就是以空格为分割符进行计数,因为上面获取列表的时候就是用空格进行分割的。
而sysfunc的这个函数的意思是让一些不是宏函数的函数再宏中也能发挥作用。
%let brand = %scan(&car_brands, &i);这行命令就是取出这个值