當我們將大批有規律的檔名讀進來,並經由巨集指令(Macro language)轉換成流水號形式的檔名,但最終還是要將每一個檔合併起來,若不以巨集指令合併檔案,傳統的作法即如[程式一]所示,利用SET語法將468個檔案合併起來,利用DATA令宣告新的檔名為e.cd,因此需要把檔名書寫468次,過程必須如屢薄冰般的謹慎。今日將以巨集指令的兩個範例[程式二][程式三],示範大批資料的合併。



[程式一]

data e.cd;
set e.cd1 e.cd2 e.cd3 e.cd4 e.cd5 e.cd6 e.cd7 e.cd8 e.cd9 e.cd10 .......e.cd468;
run; 

[程式二] %macro宣告將執行巨集指令,且巨集名稱(macro name)m1,並未給定任何參數,%mend說明巨集結束於此。巨集的迴圈為程式段[%do i=1 %to 468; ]。利用DATA指令將新的檔案命名為e.cd,以SET指令讀取一個空的檔,檔名為_NULL_NULL這個英文字即是零或虛無的意思,因為讀取零筆資料,所以DATA指令所建立的新檔案E.CD也是空的。這是一個預備動作,彷彿拿了一個空籃子,準備將球一個一個丟進來,而空藍子指得是哪一個檔呢? [答案; E.CD]

接下來是開始撿球入籃的動作。此時,利用SET讀取空藍子E.CD中的檔案,結果空無一物,於是再讀之前的468個檔中編號為1的檔,同時DATA指令後方的新檔名依舊是E.CD,因為要反覆將球丟進同一個籃子裡,於是E.CD不再是空籃子了,而是E.CD1檔案中的所有資料。由於迴圈先被啟動,因此可以指定SET要讀第幾個檔到E.CD中。當迴圈跑到2,即指定E.CDE.CD2被讀取進來,並裝進E.CD裡,因此DATA指令後的E.CD中被放入兩個檔案的資料,即E.CD1E.CD2;迴圈跑到3的時候,即指定E.CDE.CD3被讀取進來,聰明的您,可以推演中DATA指令後方的E.CD中有什麼資料呢? [答案; E.CD1, E.CD2, E.CD3]

不知道您理解了嗎?

[程式三] [程式二]的變形,為什麼要示範這一隻程式呢? 因為E.CD像滾雪球般愈滾愈大,每啟動一個迴圈,就要啟動一次這顆大雪球,當468個檔案都是大檔案時,雪球滾幾次就巨大無比,滾不動啦!所以要分段合併。[程式三]係將資料依就醫年度合併,DATA指令後方的檔名是E.CD&y yM1的一個參數,它所對應的數值是1998~2010,即就醫年度。當y1998,新的資料檔被命名為E.CD1998xM1的另一個參數,標示第幾個就醫年,例如1998年為第一個就醫年,1999年為第二個就醫年,以此類推。%m1(1998,1)指令說明參數yx的對應值,對應的順序不能寫反。本段程式利用迴圈將每36個檔併入同一個就醫年中,程式中的%do i=36*(&x-1)+1 %to 36*&x; 是什麼意思呢?當參數x對應到1時,左式被解開為 %do=1 %to 36;當參數X對應到2時,左式被解開為 %do=37 %to 72; 其他以此類推。因此當y對應到1998, x對應到1時,SET指令所讀取的檔案為E.CD1998 , E.CD1(~E.CD36),一個x參數即可跑36個迴圈,因此能將E.CD1~E.CD36放入DATA指令後方的E.CD1998。最後再以[程式一]的方式將每年的資料合併起來即可。


程式雖然不長,但不知各位理解了嗎?


[程式二]
%macro m1;

data e.cd ;
set _null_; /*-拿起空籃-*/
run;

%do i=1 %to 468; /*-迴圈--*/



data e.cd;
set e.cd e.cd&x; /*--撿球入籃--*/
run;
%end;


%mend m1;
%m1

[程式三]
%macro m1(y,x);
data e.cd&y ;
set _null_;
run;

%do i=36*(&x-1)+1 %to 36*&x;

data e.cd&y;
set e.cd&y e.cd&x;
run;
%end;
%mend m1;
%m1(1998,1) %m1(1999,2) %m1(2000,3) %m1(2001,4) %m1(2002,5) %m1(2003,6) %m1(2004,7) %m1(2005,8) %m1(2006,9)
%m1(2007,10) %m1(2008,11) %m1(2009,12) %m1(2010,13)

arrow
arrow

    estat 發表在 痞客邦 留言(2) 人氣()