close
要如何合併多個檔案我想是很多人在資料處理時很容易遇到的問題。
以人力資源調查資料庫為例,這是一個長達二十幾年,每個月都調查的資料,也就是說一年有十二個檔案,總共有二十幾年,為了怕弄混,每一個月份的檔案都存在不同資料,然後每十二個月的檔案又放在一個資料夾中。若要一個一個打開,複製貼上一定會浪份不少時間。
先不考慮每年的coding是否相同,我先以合併同一年份的檔案為例。

%macro LB95;
%let m = 01 02 03 04 05 06 07 08 09 10 11 12;
%do i = 1 %to 12;
%let moon=%scan(&m,&i);
data temp ;
infile "C:\data\manpower\mp95\mp95&moon\LB95&moon..dat";
input#1 Towncode 4-10 a2 21 a3 22-24 a4 25 ;
run;

這是程式的前半段。
想法很簡單,因為我每個月的資料都放在不同資料夾,比如說一月的資料我就放在LB9501,二月我就放在LB9502,那我是不是只要設計一個程式,能夠按照01、02的順序替換掉資料夾的名稱,就能順利讀取檔案?

其中的關鍵是%let和%scan的用法。
%let是一前導指令,可以指定多個字串作為前導變項。%scan則是用來讀取%let中的字串,可以依序讀取,第一次讀取01、第二次讀取02。設定好巨集指令後,我再以&moon來呼叫前導指令中設定的變數。sas中前導變項的功能非常強大,幾乎可以出現在程式中的任何地方。

看起來神奇,說起來簡單,前導指令和前導變項的關係其實就是複製貼上。當程式讀到&開頭的前導變項時,會代換以%為開頭的前導指令。假使前導變項後面還要加上其他文字,就得加個"."將他們隔開,不然sas程式會以為&後面到空白處都是同一個前導變項。

我在infile的地方用&moon前導變項替換檔案路徑,和檔案名稱,讓程式可以讀取不同資料夾中的檔案,只要你在歸檔的時候有順序的排列,在使用巨集的時候也會變得比較輕鬆。

%if &i=1 %then
%do;
data LB95;
set temp;
run;
%end;
%else
%do ;
data lb95;
set lb95 temp;
run;
%end;
%end;
%mend LB95;
%LB95;

最後面這邊就只是很單純在合併不同年的檔案。sas中有很多指令都是一組一組的。像是do對應end,data對應run,寫的時候要注意有沒有對好,沒有對好可就執行不暸。
arrow
arrow
    全站熱搜

    kenshin528 發表在 痞客邦 留言(1) 人氣()