3.1 追加原始檔案
原始資料可以使用以下的方法進行縱合并。
- INFILE語句
- FILENAME語句
- FILEVAR=選項
-
作業系統自身的技術
首先,你可能要察看原始資料。可以用FSLIST過程。
文法:
PROC FSLIST FILE = file-specification;
RUN;
實際使用中,專門的編輯器,如UltraEdit之類的小軟體,用來察看原始檔案有着更多的便利。
INFILE
為了讀取多個原始檔案,可以使用多個INFILE語句。這樣資料步會從第一個檔案中讀出一條記錄,再到第二個檔案讀一條記錄,以此類推,讀完所有檔案再傳回第一個檔案。如下圖所示
sas infile和filename FILENAME
你也可以使用FILENAME語句,對原始檔案進行串聯。如下圖所示:
sas infile和filename FILENAME文法如下:
FILENAME fileref ('external-file1'
'external-file2' … 'external-filen');
其中fileref是任何8位或以下的有效SAS名稱。
'external-file' 是資料檔案的實體名。
例如:
filename Q1 ('Month1.dat' 'Month2.dat' 'Month3.dat');
data firstq;
infile Q1;
input Flight $ Origin $ Dest $
Date : date9.
RevCargo : comma15.2;
run;
FILEVAR=
使INFILE語句的FILEVAR=選項,它可以幫助你有條件的連接配接多個原始檔案,如下圖所示:
sas infile和filename 文法:
infile xxx filevar = NextFile;
xxx 是任意的8位或以下的占位名,不是一個實際的檔案名或者定義好的檔案引用。SAS使用這個占位名在日志中報告處理資訊。
NextFile 存放原始資料檔案名的變量。
例如:
data movingq;
do I = 11,10,9;
NextFile = "Month"!!put(I,2.)!!".dat";
NextFile = compress(NextFile,' ');
infile xxx filevar = NextFile;
input Flight $ Origin $ Dest $ Date : date9.
RevCargo : comma15.2;
output;
end;
stop;
run;
這個例程把Month11.dat, Month10.dat, Month9.dat三個原始檔案裝入到movingq資料集中,從中我們可以學到幾點:
1. 需要使用STOP語句跳出資料步循環。
2. COMPRESS函數删除了字元串中的空格,使"Month 9.dat"變成"Month9.dat"。
3. 以上程式隻在每個原始檔案中讀出頭一條記錄。
使用END=選項,我們可以控制資料步讀完整個原始檔案。
文法:
INFILE file-specification END = variable;
END=選項把是否到達輸入檔案結尾标志放進variable變量中,如果目前的輸入沒有到達檔案尾,變量值為0;反之變量值為1
該變量不會被寫入到輸出SAS資料集中。
由此,完整的程式為:
data movingq;
do I = 11,10,9;
NextFile = "Month"!!put(I,2.)!!".dat";
NextFile = compress(NextFile,' ');
do until (LastObs);
infile xxx filevar = NextFile end = LastObs;
input Flight $ Origin $ Dest $ Date : date9.
RevCargo : comma15.2;
output;
end;
end;
stop;
run;
項目中經常用到如下技巧:
data movingq;
MonNum = month(today());
MidMon = month(intnx(‘month’,today(),-1));
LastMon = month(intnx(‘month’,today(),-2));
do I = MonNum, MidMon, LastMon;
NextFile = "Month"!!put(i,2.)!!".dat";
NextFile = compress(NextFile,' ');
do until (LastObs);
infile xxx filevar = NextFile end = LastObs;
input Flight $ Origin $ Dest $ Date : date9.
RevCargo : comma15.2;
output;
end;
end;
stop;
run;
以上程式讀出當月和之前兩個月的原始資料。這裡的重點是INTNX函數,如果我們直接用目前月-1,-2來得到前兩個月,在1,2月時程式就會發生錯誤。INTNX作用是傳回間隔某個時間端的時間。函數格式為:
INTNX('interval',start-from,increment)
'interval' 一個字元常量,或者是存放時間間隔機關的變量。表示間隔機關。
start-from 表示日期,日期時間或者時間的SAS表達式,作為起始點。
increment 一個正或者負整數,表示時間間隔的數量。
函數細節可以查詢SAS線上幫助。
題外話,與考試無關。項目中用的更多的是讀出一個路徑下的同一類接口檔案,簡便方法是使用如下FILENAME。
FILENAME cf_list PIPE 'dir c:|rawdata|cf????.dat /b';
DATA cf_data;
INFILE cf_list;
LENGTH filename $20;
INPUT filename $;
INFILE in FILEVAR = filename END = LastFile;
DO WHILE (LastFile = 0);
INPUT ....
....
;
OUTPUT;
END;
RUN;
這段程式把c:|rawdata下面的所有cf0101.dat,cf0102.dat,...,cf????.dat讀入cf_data資料集中。如果看不明白,說明以上的内容你還沒有全部了解 :-)