Leo Yeh's Blog

SAS 基礎程式 (7)

教學目標

初步了解 SAS 基礎程式如何有效進行格式化輸入的應用。

重點概念

(請注意以下內容皆為課程心得筆記,若有不清楚的部份,建議上官方主辦的 SAS Programming 2 課程,謝謝。)

我們主要會使用 INPUT 敘述有效進行資料讀取的應用,在實務應用中我們通會需要讀取外部資料進行商業分析,外部資料主要可以分為標準型和非標準型的資料,一般來說,文字皆是標準型資料,而僅有數值才有標準和非標準的格式,像是標準格式為 -1234,非標準格式為 (1,234),我們會透過格式化 INPUT 敘述讀取非標準格式的資料。

格式化 INPUT 敘述

1
INPUT <指標控制1> 變數1 輸入格式1 <指標控制2> 變數2 輸入格式2 … ;

首先會在設定指標控制指定起始位置,主要有 @n 指定左右絕對位置,+n 指定左右相對位置 #n 指定上下位置,接著設定變數的名稱,再來設定變數的輸入格式,最後再針對下一個讀取的變數進行設定。

接著也可以透過 INPUT 敘述讀取多行資料,下述 SAS 程式主要讀入多行的資料。

Contract.txt 原始資料內容,儲存路徑和名稱為 C:\DATA\Contract.txt。

1
2
3
4
5
6
7
8
陳XX
台灣
台北
09XXXXXXXX
林XX
台灣
高雄
09XXXXXXXX

INPUT 多行輸入 SAS 程式,其中若 INPUT 後是空的,則不會讀入 PDV 中,因此最後產生資料集中的變數只會有 Name 、 Address 和 Phone ,分別代表全名、地址和電話。

1
2
3
4
5
6
7
8
Data contracts;
INFILE "C:\DATA\Contract.txt";
INPUT Name $30. ;
INPUT;
INPUT Address;
INPUT Phone;
RUN;
PRO

輸出結果

Obs Name Address Phone
1 陳XX 台北 09XXXXXXXX
2 林XX 高雄 09XXXXXXXX

然而我們是否能夠透過行指標控制指定特定行數呢?事實上只要過 / 敘線就能夠讀取下一行資料。

行指標控制 SAS 程式,其中 INPUT 敘述只需寫一次,以及 / 代表讀取下一行資料, / / 代表讀取下二行資料。

1
2
3
4
5
6
Data contracts;
INFILE "C:\DATA\Contract.txt";
INPUT Name $30. / /
Address /
Phone;
RUN;

輸出結果

Obs Name Address Phone
1 陳XX 台北 09XXXXXXXX
2 林XX 高雄 09XXXXXXXX

此外我們也可以透過 #n 指定行的位置,直接讀取指定行的位置。

行指標控制 SAS 程式,其中 INPUT 敘述只需寫一次,以及 #1 代表讀取第一行資料,#3 代表讀取第三行資料。

1
2
3
4
5
6
Data contracts;
INFILE "";
INPUT #1 Name $30.
#3 Address
#4 Phone;
RUN;

輸出結果

Obs Name Address Phone
1 陳XX 台北 09XXXXXXXX
2 林XX 高雄 09XXXXXXXX

再來只要起始位置是 1 則 @1 可以省略,而 / 和 #n 是上下位置, +n 和 @n 是左右位置,接著 @ 代表暫停先進行其它處理,例如 IF-THEN 敘述針對 INPUT 變數進行判斷,或者透過 INFILE 輸入緩衝區內容進行判斷,而 @@ 則代表讀取資料一直讀取不換行,請注意 @ 只能用在 INPUT 敘述,而不能使用於 SET 敘述。

最後讀取資料時若只想讀取特定資料時,則會透過 IF 敘述,請注意此處與 IF-THEN 敘述是不同,此處的 IF 敘述是指符合條件才會往下執行接下來的敘述,否則直接跳至 RUN 敘述,而 IF-THEN 敘述則不論是否符合條件,皆會執行 RUN 敘述之前的所有敘述,以及建議 IF 敘述在 INPUT 敘述之前會增加讀取效率。至於輸入格式的長度將會會影響 PDV 中的變數長度。

總結在 INPUT 敘述中經常會看到 + @ / # 等特殊符號皆代表不同的意義,左右讀取會用到 + 和 @ 特殊符號,上下讀取會用到 / 和 # 特殊符號,而 $ 和 . 皆是代表格式設定,所以我們需要深入了解在 INPUT 敘述中特殊符號的應用,才能夠讀取不同格式的外部資料,以利提升資料品質,更進一步進行商業分析的應用。

相關資源

⬅️ Go back