SAS | 數據讀取高階方法


 

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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM