太久沒有記錄了,上次差不多是半年前了。工作之后就太忙了,也抽不出時間來記錄。
現(xiàn)在就回來記錄一些吧,要學(xué)的有些雜,筆記也會記得很雜。
現(xiàn)在有一個任務(wù):有一個表cars,其中的make列有多個汽車品牌,現(xiàn)在依據(jù)不同的汽車品牌將表進行拆分,每個子表對應(yīng)一個類型的汽車。
教學(xué)書中的解法:
因為要建多個子表,所以用到了do循環(huán),循環(huán)要用到數(shù)字1 to n,所以這里先將汽車品牌進行映射

使用proc format的方式進行映射,后面可以直接使用 put(&i , carname.)的方式取出對應(yīng)的品牌名。
接下來就是使用sas中的do循環(huán)來進行循環(huán)建表了

和我想的一樣,建立一個宏函數(shù),在其中調(diào)用do循環(huán)和if判斷。
這種方法確實可行,但其實有一個巨大的坑,那就是一開始的映射,你三個汽車品牌可以自己挨個寫,那如果有30個呢?如果有300個呢?
新的解法:
新的解法使用proc SQL與宏函數(shù)結(jié)合來解這個問題(畢竟SQL寫得習(xí)慣了)
首先獲得汽車的品牌列表

然后定義宏來拆分表格

這里解釋一下這個sysfunc(countw(&car_brands));這一行代碼
這個countw的作用就是以空格為分割符進行計數(shù),因為上面獲取列表的時候就是用空格進行分割的。
而sysfunc的這個函數(shù)的意思是讓一些不是宏函數(shù)的函數(shù)再宏中也能發(fā)揮作用。
%let brand = %scan(&car_brands, &i);這行命令就是取出這個值