用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提供了以下四種基本的輸入模式:
- 列輸入模式(Column) ——應用於欄位固定的文字檔案
- 格式化輸入模式(Formatted) ——應用於欄位固定的文字檔案
- 列舉輸入模式(List) ——應用於分隔符固定的文字檔案
- 命名輸入模式(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;
優點:
- 對欄位的選擇非常靈活,可以任意選擇欄位,以及安排讀入的次序;
- 整個欄位或其部分可以重複讀入;
- 欄位間不一定要有空格或者其他分隔符來分隔;
- 字元變數最多可含32K個字元,並可以包含空格符;
- 對缺失資料沒有特殊佔位符的要求。一個空格欄位就讀為一個缺失值,也不會引起其他欄位讀入的錯誤。
侷限:
- 可以設定輸入長度,但不可以設定輸入格式。對數值型變數,只能讀入標準資料值(Standard Numeric Data Value),即只包括數字、正負號、小數點和科學計數符號E構成的數,對日期型資料,以及包含美元符號、逗號等其他符號的數值,因為需要設定輸入格式並 按格式讀入,列輸入模式就無法正確讀取。
2.格式化輸入模式(Formatted)--應用於欄位固定的文字檔案
格式化輸入模式類似於列模式:
- 它適用於欄位固定格式的資料檔案;
- 它也給出欄位開始的列數,但不直接給出結束列數,而是通過輸入格式給出讀入長度;
- 它可以設定輸入格式。
它的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.