June 29, 2013

[SAS] 利用PROC IMPORT匯入外部資料

因為資料來源的不同,所以拿到的資料格式往往各式各樣,可能是Excel的xls,xlsx檔,SPSS的sav檔,STATA的dta檔,txt純文字檔,csv檔,dat原始資料檔等等。SAS雖然能使用Import Wizard匯入其他統計套裝軟體和Excel資料,但以我過去的經驗來講,套裝軟體之間的發行時間差太多,或是作業系統因素(參考 【SAS 9.3小技巧】SAS 9.3 64位元版匯入Excel?! ),常常會讓這個功能折騰使用者老半天,所以建議在原生軟體先把資料存成純文字檔讓SAS來讀取(建議存成CSV檔,以逗號來區隔資料的純文字格式),今天將介紹如何用SAS內的PROC IMPORT敘述句來匯入純文字格式的外部資料。(.dat原始資料還是要使用FILENAME+INFLIE敘述句來匯入)

PROC IMPORT的語法結構

PROC IMPORT
 DATAFILE="filename"
 OUT=<libref .="">SAS data set
 DBMS=identifier
 REPLACE;
 GETNAMES=YES|NO;
 GUESSINGROWS=n; DELIMITER=char|'nn'x;

選項說明

  1. DATAFILE="filename"
    宣告待匯入的檔案位置
  2. OUT=<libref .="">SAS data set
    宣告匯出的目標資料集
  3. DBMS=identifier
    宣告匯入的檔案類型,選項有CSV(以逗點區隔),DLM(以空白或符號區隔),TAB(以TAB區隔),JMP
  4. Replace
    宣告匯入的資料覆寫現有的資料集,系統預設是不覆寫,如不宣告則可能導致匯入資料重複,務必注意。
  5. GETNAMES=YES|NO
    宣告是否將資料的第一行當作變項名稱
  6. GUESSINGROWS=n
    PROC IMPORT會自動掃描匯入資料來判斷該變項的類型(數字or文字or日期)與變項的長度,如果資料內的變項長度屬固定值,ISBN、身分證字號,則不需考慮此項目,但如果資料長度是變動的,通常是文字變項,如地址、email等,則此變項需要考慮。預設值是20,固定變項者可以減少該數值以加快匯入速度。
  7. DELIMITER=char|'nn'x
    宣告資料分隔符號,預設值是空白,如設&為區隔符號則DELIMITER="&"。只有當DBMS=DLM時才宣告DELIMITER,DBMS=TAB與DBMS=CVS時皆可省略。

範例

範例一:以TAB區隔的資料
下列資料位置在D:\Data之下,檔名為tab.txt,欲建立在名為mydata的Libary之下,匯入的資料集為tab
Name Gender Age
Joyce F 11
Thomas M 11
Jane F 12
Louise F 12
James M 12
John M 12
Robert M 12
Alice F 13
Barbara F 13
Jeffery M 13
Carol F 14
Judy F 14
Alfred M 14
Henry M 14
Jenet F 15
Mary F 15
Ronald M 15
William M 15
Philip M 16
範例程式1:
PROC IMPORT DATAFILE="D:\DATA\TAB.TXT" OUT=MYDATA.TAB DBMS=TAB REPLACE; GETNAMES=YES; DATAROW=5; RUN; ※上述資料如果直接複製到記事本會變成以空白做間隔的檔案,因此重新調整為以Tab做間隔之後程式就能順利運作。
範例二:以&為區隔符號的資料
下列資料位置在D:\DATA之下,檔名為DelSpec.txt,同樣欲建立在名為Mydata的Libary之下,匯入的資料集名稱為data01 Region&State&Month&Expenses&Revenue
Southern&GA&JAN2001&2000&8000
Southern&GA&FEB2001&1200&6000
Southern&FL&FEB2001&8500&11000
Northern&NY&FEB2001&3000&4000
Northern&NY&MAR2001&6000&5000
Southern&FL&MAR2001&9800&13500
Northern&MA&MAR2001&1500&1000
範例程式2:
PROC IMPORT
DATAFILE="D:\DATA\DELSPEC.TXT"
OUT=MYDATA
DBMS=DLM
REPLACE;
DELIMITER="&";
GETNAMES=YES;
RUN;

範例三:CSV格式檔(資料以逗號做區隔)
下列資料位置在D:\DATA之下,檔名為Newdata.csv,同樣欲建立在名為Mydata的Libary之下,匯入的資料集名稱為data02 "Africa","Boot","Addis Ababa","12","$29,761","$191,821","$769"
"Asia","Boot","Bangkok","1","$1,996","$9,576","$80"
"Canada","Boot","Calgary","8","$17,720","$63,280","$472"
"Central America/Caribbean","Boot","Kingston","33","$102,372","$393,376","$4,454"
"Eastern Europe","Boot","Budapest","22","$74,102","$317,515","$3,341"
"Middle East","Boot","Al-Khobar","10","$15,062","$44,658","$765"
"Pacific","Boot","Auckland","12","$20,141","$97,919","$962"
"South America","Boot","Bogota","19","$15,312","$35,805","$1,229
" "United States","Boot","Chicago","16","$82,483","$305,061","$3,735"
"Western Europe","Boot","Copenhagen","2","$1,663","$4,657","$129"
範例程式3:
PROC IMPORT
DATAFILE="D:\DATA\NEWDATA.CSV"
OUT=MYDATA.DATA02
DBMS=CSV
REPLACE;
GETNAMES=NO;
RUN;

附註:

有些時候會因為情況特殊需要特別處理,譬如大多數樣本的A變項是數值,但某些比較特別的個案在A變項卻是文字,這時候如果沒有處理,IMPORT敘述句就會以數字匯入,並且將A變項是文字的個案變成遺漏值,如果這樣的狀況會影響到後續的資料分析,可以參考這篇文章的做法:以文字格式讀取CSV資料檔中的欄位(變項)

參考資料:

IMPORT Procedure
Avoid truncating characters in PROC IMPORT csv

本著作依據Creative Commons 姓名標示-非商業性-相同方式分享授權條款釋出

No comments :