1 在INFILE語句中使用選項控制輸入(infile選項)
infile語句中的選項,放在infile語句中文件名的后面,可以改變SAS讀取原始數據文件的方式,對於讀取特定類型的數據文件非常有用。
FIRSTOBS=
用於告知SAS是從第幾行開始讀取數據。這對於哪些在開頭有描述性文本和頭信息的數據文件非常有用。
OBS=
用於告知SAS讀取到數據文件哪一行時停止。「OBS=」選項常和「FIRSTOBS=」選項一起使用,以便從數據文件的中間讀取文件
MISSOVER
默認情況下,SAS讀完一行數據后,如果input語句中還有一些變量沒有賦值,SAS將會在下一數據行讀取數據。「MISSOVER」選項會告知SAS:當一行數據讀完的時候不要轉到下一行,而是為其余的變量分配缺失值。
TRUNCOVER
當你使用列輸入或者格式輸入讀取數據時,並且一些數據行比其他行短的時候,你需要使用「TRUNCOVER」選項,該選項作用時告知SAS為變量讀取數據,直到遇到數據行的結尾,或者遇到了在格式或列范圍指定的最后一個列。二者以先遇到者為准。
TRUNCOVER 和 MISSOVER 類似,要注意區分:
- 聯系:如果數據行在變量作用域開始之前就結束,它們都會為變量分配缺失值
- 區別:如果數據行在變量作用域中間結束,TRUNCOVER 將盡量讀取可用數據,而MISSOVER 會直接為變量分配一個缺失值
2 使用DATA步讀取分隔文件(infile選項)
分隔文件是一種使用特殊字符分隔數據值的原始數據文件,通常使用逗號(,)或制表符(Tab)作為分隔符,SAS為infile語句提供了連個使其更容易讀取的選項:DLM= 選項和 DSD 選項。
DLM=選項
若期望讀取的數據文件分隔符是空格,則可以使用列表輸入讀取數據。但若是其他分隔符,這時就需要使用infile語句中的DELIMITER= 或 DLM= 選項,來讀取使用任意分隔符的數據文件,只需要把分隔符方在 DLM= 選項后面的等號中(如 DLM='&')。如果分隔符是一個字符串,則使用 DLMSTR= 選項。
示例:infile 'D:\code\test.dat' DLM = ',' ;
注意,若分件使用制表符(Tab)分隔,則 DLM='09'X (ASCII碼)。
DSD選項
默認情況下,SAS將兩個或更多的連續分隔符解釋為一個分隔符。如果你的文件有缺失,且連續兩個分隔符代表缺失值,那么將使用到infile語句中的DSD選項(分隔符敏感數據),它有三層作用,並可以配合 DLM= 選項使用。
- 忽略用引號括起來的數據值中的分隔符
- 不會把引號作為數值的一部分讀取
- 把兩個連續的分隔符視為缺失
示例:infile 'file - specification' DLM = '09'X DSD ;
CSV文件
逗號分隔符文件被稱為CSV文件,針對這類文件,通常采用DSD選項來進行讀取。但存在一種特殊情況:在數據行的末尾可能出現缺失值,這時就需要 DSD選項 和 MISSOVER選項 連用,告知SAS當一行數據不夠時,不要跳到下一行繼續讀取。
示例:infile 'D:\code\test.csv' DLM = ',' dsd missover ;
3 使用IMPORT過程讀取分隔文件(import)
SAS中通常有不止一種方法來達到相同的結果
前面已經學習過使用DATA步讀取分隔文件,接下來學習的IMPORT過程,也能實現同樣的結果。
PROC IMPORT
import過程會自動掃描數據文件前20行,以自動確認變量類型(數值型或字符型)。它還能為字符型指定長度及識別一些日期格式。同時,proc import 會把數據文件中連續的分隔符視為缺失值,讀取引號中包含的數據值,以及當數據讀完的時候為其余的變量分配缺失值。而且,可以根據需要,把數據文件中的第一行作為變量的名稱。
示例:proc import datafile = 'filename' out = data-set ;
filename是想要讀取文件的名稱,data - set是要創建的SAS數據集的名字。同時,SAS將通過文件的拓展名來確認文件的類型:
文件類型 | 拓展名 | DBMS 標識符 |
---|---|---|
逗號分隔的 | .csv | CSV |
制表符分割的 | .txt | TAB |
使用其他分隔符分隔的 | DLM |
如果文件沒有適當的拓展名,或文件是某種DLM類型,則必須再 proc import 中使用 DLMS= 選項。如果已經有一個和 out= 選項中同名的SAS數據集,並且想要覆蓋它,則需要使用 REPLACE 選項。
proc import datafile = 'filename' out = data-set
dbms = identifier replace ;
可選語句
一些文件類型需要用一些額外的指令才能正確讀取。
- 如果數據文件不是在第一行,可以使用 DATAROWS 語句
- 如果分隔符號不是逗號、制表符或者空格,可以使用 DELIMITER 語句
- 如果文件只包含數據,沒有標題行,可以使用 GETNAMES=NO 語句分配默認的變量名稱
- 如果數據在前20行全是缺失值或者沒有代表性的數據,可以使用 GUESSINGROWS 語句,以確保變量被分配了正確的數據類型和長度
datarows = n; /* 從第n行開始讀取數據,默認是1 */
delimiter = 'delimiter-character'; /* DLM文件的分隔符,默認是空格 */
getnames = no; /* 不要從輸入文件的第一行獲取變量名稱,默認yes;如果是no,變 量名稱為var1、var2、var3等 */
guessingrows = n; /* 使用n行來確定變量的類型,默認20 */
proc import datafile = 'D:\code\test.csv' out = music replace;
run;
4 使用IMPORT 過程讀取Excel文件(import)
在SAS中可以使用 PROC IMPORT 過程來讀取Excel文件,需要注意的是 import 過程在不同的系統中(windows和unix)用法有一些區別:
使用import過程讀取Excel文件一般形式:
proc import datafile = 'filename' out = data-set
dbms = identifier replace ;
其中filename是要讀取的文件;data-set是要創建的SAS數據集名稱;replace選項是告訴SAS替換 out= 選項中指定的數據集(若存在的話)dbms= 選項告知SAS要讀取的Excel文件類型,但它不是必需的。
DBMS 標識符
三種最常用的標識符是excel、xls、xlsx。
- unix系統中:xls用於讀取文件(拓展名.xls);xlsx用於讀取文件(拓展名.xlsx)
- windows系統中:xls、xlsx的用法同unix,並且多了excel標識符,可讀取所有類型的excel文件
需要區分的是,excel標識符使用了不同的讀取技術,所以結果可能會有所不同。默認情況下,xls、xlsx標識符相較於excel會查看更多的數據行來確定列的類型。
可選語句
如果文件中有多個工作表,可以使用 SHEET 語句指定要讀取那個工作表。
語法:sheet = "sheet-name" ;
如果只想讀取工作表中特定的單元格,可以用 range 指定一個區域。該區域可以是命名區域(如果已定義),或者可以安裝以下方式指定所在預取的左上和右下單元格。a
語法:range = "sheet-name$UL:LR" ;
默認情況下,import過程使用電子表格的第一行作為變量的名稱。如果你不想這樣做,可以向該過程添加 GETNAMES 語句(僅限excel標識符),SAS會將這些變量命名為F1、F2等。
語法:getnames = no ;
當使用excel標識符時,如果有一列同時包含數值和字符值。默認情況下,數值將被轉換成缺失值。為了將數值讀取成字符類型而不是缺失值,可以使用 MIXED 語句。
語法:mixed = yes ;
proc import datafile = 'D:\code\test.csv' dbms = xls out = music replace;
run;