1. 程式人生 > >用SAS讀入原始資料(1):文字檔案 的四種格式

用SAS讀入原始資料(1):文字檔案 的四種格式

文字檔案多以.txt、.dat以及.csv為字尾(在Unix/Linux世界,還可能出現.data資料甚至沒有後綴的情況)。一般分兩種,其一看起來跟下面一樣——如果用UltraEdit等編輯器開啟,你能看到指示列數的標尺,而且每個欄位的列數是固定的,稱為欄位固定(Fixed Fields)的文字檔案:

2810 61 MOD  F
2804 38 HIGH F

下面的資料中,每個欄位的列數不必相同,但都由同一樣個的分隔符(這裡是逗號)分開,所以稱為分隔符固定(Delimited Data)或者自由格式(Free-format)的檔案檔案。如果分隔符為逗號(通常以.csv為字尾),乾脆就叫做“用逗號分隔的文字檔案”:

1-Mar-90,LON,198
13-Mar-90,FRA,2073

對以上兩種文字格式的資料,SAS提供了以下四種基本的輸入模式:

  1. 列輸入模式(Column) ——應用於欄位固定的文字檔案
  2. 格式化輸入模式(Formatted) ——應用於欄位固定的文字檔案
  3. 列舉輸入模式(List) ——應用於分隔符固定的文字檔案
  4. 命名輸入模式(Named)

對以上幾種輸入模式,基本的語句如下,區別就在於input語句的具體設定:

data 你對匯入資料的命名;
    infile  原始檔名,加上具體的碟符位置;
    input 變數輸入設定;
run;

1.列輸入模式(Column)

--應用於欄位固定的文字檔案

對欄位固定的原始檔,input語句的形式是

input 變數名1<s>開始列數-結束列數 變數名2<s>開始列數-結束列數 …;

一個能工作的列輸入模式語句看起來就像下面展示的:

data work.example1;
    infile 'C:/data/example1.dat'  firstobs=2 obs=100;
    input ID 1-3 Name $ 5-10;
run;

優點:

  1. 對欄位的選擇非常靈活,可以任意選擇欄位,以及安排讀入的次序;
  2. 整個欄位或其部分可以重複讀入;
  3. 欄位間不一定要有空格或者其他分隔符來分隔;
  4. 字元變數最多可含32K個字元,並可以包含空格符;
  5. 對缺失資料沒有特殊佔位符的要求。一個空格欄位就讀為一個缺失值,也不會引起其他欄位讀入的錯誤。

侷限:

  1. 可以設定輸入長度,但不可以設定輸入格式。對數值型變數,只能讀入標準資料值(Standard Numeric Data Value),即只包括數字、正負號、小數點和科學計數符號E構成的數,對日期型資料,以及包含美元符號、逗號等其他符號的數值,因為需要設定輸入格式並 按格式讀入,列輸入模式就無法正確讀取。

2.格式化輸入模式(Formatted)--應用於欄位固定的文字檔案

格式化輸入模式類似於列模式:

  1. 它適用於欄位固定格式的資料檔案;
  2. 它也給出欄位開始的列數,但不直接給出結束列數,而是通過輸入格式給出讀入長度;
  3. 它可以設定輸入格式。

它的input語句的格式為:

input <指標控制> 變數名 輸入格式 …;

注1:指標控制,就是將輸入列指標控制在某個位置,作為讀入欄位的開始列號,它有 @n 或者 +n 的形式:

  • @n表示從第n列開始讀入(指示開始列數的絕對位置);
  • +n表示將列控制指標增加n列侯讀入(指示相對位置)。

一個能工作的格式化輸入模式語句看起來就像下面展示的:

data work.example2;
    infile 'C:/data/example2.dat';
    input Name $ 2. @3 Job $5. +7 Place $8.;
run;

3.列舉輸入模式(List)--應用於分隔符固定的文字檔案

因為分隔符固定的資料可以用分隔符來確定欄位,input語句特別簡單:

input 變數名<s>…;

如果要讀入非空格分隔符的資料,就需要在infile語句中指明(預設為空格):

infile 檔案碟符 <dlm="分隔符">;

在列舉模式下,變數長度的預設值為8,長度超過8的字元變數在讀入時會被截斷,這時可以用lenght語句來設定長度:

length 變數名<s> 長度;

列舉模式也可以設定輸入格式,這隻需要在輸入變數設定時附加上相關修飾:

input 變數名<s>: 輸入格式 …;

一個能工作的列舉輸入模式語句看起來就像下面展示的:

data work.example3;
    infile 'C:/data/example3.dat' dlm=',';
    length item $ 10.;
    input ID Name $ item $   income:comma9.;
run;

4.命名輸入模式(Named)

命名輸入模式很少見到,因為很難得見到這種格式的原資料,其中三個變數是ID、Name和Score:

1 Name=Tom Score=A
2 Name=Jim  Score=C

相應的input語句為:

input  ID Name=$3. Score=$1.