天天看點

sas infile和filename

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資料集中。如果看不明白,說明以上的内容你還沒有全部了解 :-)

SAS