sas infile和filename
生活随笔
收集整理的這篇文章主要介紹了
sas infile和filename
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
3.1 追加原始文件
原始數據可以使用以下的方法進行縱合并。
原始數據可以使用以下的方法進行縱合并。
- INFILE語句
- FILENAME語句
- FILEVAR=選項
- 操作系統自身的技術
首先,你可能要察看原始數據。可以用FSLIST過程。
語法:
PROC FSLIST FILE = file-specification;
RUN;
實際使用中,專門的編輯器,如UltraEdit之類的小軟件,用來察看原始文件有著更多的便利。
INFILE
為了讀取多個原始文件,可以使用多個INFILE語句。這樣數據步會從第一個文件中讀出一條記錄,再到第二個文件讀一條記錄,以此類推,讀完所有文件再返回第一個文件。如下圖所示
FILENAME
你也可以使用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=選項,它可以幫助你有條件的連接多個原始文件,如下圖所示:
語法:
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數據集中。如果看不明白,說明以上的內容你還沒有全部理解 :-)
總結
以上是生活随笔為你收集整理的sas infile和filename的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAS宏技术中,%let和call sy
- 下一篇: CALL SYMPUT与CALL SYM