3.4 讀取PC數(shù)據(jù)文件
對(duì)于單機(jī)數(shù)據(jù)文件的讀取,除了LIBNAME語句、SQL直通設(shè)施和ACCESS/DBLOAD過程三種方式外,還可以通過IMPORT過程導(dǎo)入。
常見的各種統(tǒng)計(jì)軟件的數(shù)據(jù)文件如SPSS的.sav文件、Stata的.dta文件、JMP的.jmp文件,以及Excel文件均可以通過IMPORT過程導(dǎo)入。當(dāng)然,LIBNAME語句也是不錯(cuò)的選擇。
→3.4.1 小試牛刀
比如,我們手頭要導(dǎo)入D盤的一個(gè)SPSS文件(.sav文件),我們可以分別嘗試用IMPORT過程和LIBNAME語句。
程序3-2 導(dǎo)入SPSS文件
*==IMPORT過程; proc importout=mysasdata datafile="D:\01 SAS編程演義\02 Data\Raw\myspssdata.sav" ; run; *==LIBNAME語句; libname mysav spss "D:\01 SAS編程演義\02 Data\Raw\myspssdata.sav";
對(duì)于像SPSS這種規(guī)范格式的數(shù)據(jù)文件,這是最簡便省事的一個(gè)寫法。但是如果希望做更豐富更詳細(xì)的設(shè)置,或者是對(duì)于一些不太規(guī)則的數(shù)據(jù)文件,我們就有必要去深挖一下PROC IMPORT這個(gè)過程以及LIBNAME語句訪問PC文件的語法。
→3.4.2 PROC IMPORT語法
我們以官方的Help為基礎(chǔ),加以改造打扮后呈現(xiàn)給各位。結(jié)合前面對(duì)SAS Help風(fēng)格的介紹,我們可以比較直觀的了解一個(gè)過程更為系統(tǒng)、深入的用法。
以語法3-2為例,我們?cè)購?fù)習(xí)一下:大寫粗體的為SAS過程和語句名,如PROC IMORT、DATAFILE以及RUN;大寫非粗體的是需要我們?cè)瓨诱粘膮?shù),如DBMS、OUT以及REPLACE;小寫斜體的是需要我們填寫指定的參數(shù)或者參數(shù)值,如filename就是需要我們自己填寫的要讀入的文件;| 表示我們只能選擇其中的一個(gè)參數(shù)或參數(shù)值,因此DATAFILE和DATATABLE我們只能選一個(gè);<>表示我們可用可不用的參數(shù),因此,從語法3-2可以看出一個(gè)PROC IMORT過程只有DATAFILE或DATATABLE是必需的。
例如,程序3-2導(dǎo)入SPSS文件時(shí),我們并未指定DBMS=SAV,這是因?yàn)镾AS導(dǎo)入外部文件時(shí),會(huì)依據(jù)其擴(kuò)展名自動(dòng)猜測(cè)其DBMS的值,此外,我們指定了OUT=mysasdata,這樣我們自己給生成的SAS數(shù)據(jù)集起了一個(gè)名字叫mysasdata,方便我們自己查找辨認(rèn)。
PROC IMPORT過程的語法看起來比較復(fù)雜,大家不要一開始就害怕。先熟悉必需的、最基本的語法,以后慢慢增加控制選項(xiàng)。下面對(duì)卡片中提及的重要參數(shù)做一些補(bǔ)充說明:

語法3-2 PROC IMPORT語法參考卡片
● 指定欲讀入的文件時(shí),除了完整路徑和名稱,還可以用此前FILENAME語句給文件指定的快捷方式。例如,如果此前用filename myxls"d:\mydata.xls"指定過mydata. xls的快捷方式名為myxls,則在PROC IMPORT中可直接寫為:datafile=myxls。OUT= 指定存放的邏輯庫和數(shù)據(jù)集。有的讀者會(huì)覺得別扭:明明是讀入,為什么不是IN卻是OUT呢?如果了解到這里的OUT其實(shí)是指把讀入到PDV里的數(shù)據(jù)輸出到數(shù)據(jù)集就不會(huì)感到別扭了。
● 對(duì)于數(shù)據(jù)集選項(xiàng),我們可以用PW=選項(xiàng)加密數(shù)據(jù)集,或者用READ=、WRITE=、ALTER= 選項(xiàng)分別加密讀,寫以及修改權(quán)限;我們也可以用KEEP=、DROP=、RENAME= 選項(xiàng)篩選,重命名變量;我們還可以用OBS= 和WHERE= 篩選保留的觀測(cè)。
● 通常情況下,SAS會(huì)依據(jù)數(shù)據(jù)文件的擴(kuò)展名如.CSV、.SAV、.XLS、.DTA等自動(dòng)匹配相應(yīng)的DBMS參數(shù),因此不指定DBMS也是可以的,但是不推薦這樣做。
● 文件格式說明語句給我們對(duì)各種文件的讀取提供了更多的控制語句,比如:
■ 對(duì)于分隔符分隔的文件,我們可以用DATAROW=n指定數(shù)據(jù)從第n行開始,用GETNAMES=YES|NO來應(yīng)對(duì)數(shù)據(jù)文件首行是不是變量名,用GUESSINGROWS=n | MAX來應(yīng)對(duì)僅用默認(rèn)頭20行數(shù)據(jù)無法準(zhǔn)確判斷變量類型和長度的情況。此外,我們還可以用DELIMITER='char' | 'nn'x來個(gè)性化指定數(shù)據(jù)文件的分隔符,比如DELIMITER='#'可以讀入#分隔的數(shù)據(jù)文件,DELIMITER='20'x則可以讀入空格分隔的數(shù)據(jù)文件。其中'20' x是用二進(jìn)制表示空格的ASCII碼。
■ 對(duì)于大眾更熟悉的EXCEL文件,SAS提供了更多的控制語句。最常用的是用SHEET=讀入EXCEL文件中某特定的sheet,甚至可用RANGE=來讀入某sheet中特定的數(shù)據(jù)區(qū)域。
■ 對(duì)于SPSS、Stata數(shù)據(jù)文件,也有相應(yīng)的控制語句。具體讀者可查看SAS Help。
→3.4.3 LIBNAME訪問PC文件語法
當(dāng)然,除了IMPORT,LIBNAME語句也可做一些更為精細(xì)的設(shè)置來訪問PC數(shù)據(jù)文件,具體可參考語法3-3。

語法3-3 LIBNAME語句訪問PC文件語法參考卡片
不過LIBNAME語句讀入PC數(shù)據(jù)文件這種方式筆者個(gè)人不做推薦,這主要是因?yàn)椋?/p>
(1)并非所有的PC數(shù)據(jù)文件都有相應(yīng)的引擎支持。
(2)和PROC IMPORT相比,控制選項(xiàng)較少。
→3.4.4 實(shí)例擴(kuò)展
所謂“紙上得來終覺淺,絕知此事要躬行”,結(jié)合前面的Help和解析,我們自己動(dòng)手試試下面的案例。讀入EXCEL文件class.xlsx。這是一個(gè)很規(guī)整的文件,按表3-1數(shù)據(jù)讀取策略總結(jié)提供的思路,我們可以用PROC IMPORT進(jìn)行讀入。
程序3-3 讀入規(guī)整的EXCEL文件
*===讀入EXCEL文件; filename myexcel "D:\03 Writting\01 SAS編程演義\02 Data\Raw\class.xlsx"; proc importout=myxls datafile=myexcel dbms=excel replace; run;
有的時(shí)候,我們的EXCEL文件不是那么規(guī)整,需要我們?cè)谧x入時(shí)做更多的控制和設(shè)置,比如我只希望讀入特定SHEET的特定區(qū)域的數(shù)據(jù),這時(shí)我們就可以用RANGE、DBDSOPTS等進(jìn)行設(shè)置。在用RANGE進(jìn)行范圍設(shè)定時(shí),需要留意,范圍名要采用literate name命名法,即把范圍放在引號(hào)里,且引號(hào)后跟n,如Sheet1的A1-E20的命名為:'sheet1$A1:E20'n,或者直接用"sheet1$A1:E20"。
程序3-4 讀入特定區(qū)域數(shù)據(jù)的EXCEL文件
*===讀入指定范圍的EXCEL文件; proc importout=myxls datafile=myexcel dbms=excel replace; range='sheet1$A1:E20'n; /*讀入sheet1的A1~E20區(qū)域的數(shù)據(jù)*/ getnames=yes; /*或者rang="sheet1$A1:E20"*/ run; *===讀入指定起止行; proc importout=myxls datafile=myexcel dbms=excel replace; dbdsopts="firstobs=3 obs=18"; /*讀入sheet1的3~18行區(qū)域的數(shù)據(jù) */ getnames=yes; run;
EXCEL本身不是數(shù)據(jù)庫管理軟件,所以每一列其實(shí)并沒有固定的數(shù)據(jù)類型格式(數(shù)字/字符),SAS在讀入EXCEL文件時(shí),默認(rèn)用前8行數(shù)據(jù)判定列的數(shù)據(jù)類型和長度。如果一個(gè)文件的某一列的前8行全部為數(shù)字,那么SAS會(huì)將這一列作為數(shù)字變量讀入,但是如果在后面發(fā)現(xiàn)文本字符,導(dǎo)致數(shù)據(jù)類型不一致,而且無法轉(zhuǎn)換成數(shù)字,這時(shí)就會(huì)出現(xiàn)錯(cuò)誤。解決的辦法就是需要讓SAS讀入更多的數(shù)據(jù)行再確定數(shù)據(jù)類型,可惜針對(duì)EXCEL文件,SAS沒有直接提供這樣的選項(xiàng),不過我們可以通過修改Windows注冊(cè)表的EXCEL的TypeGuessRows項(xiàng)的值為0,這樣SAS會(huì)在讀入所有行后再確定變量的類型。
其他PC格式數(shù)據(jù)文件的讀入,同我們上面舉的例子類似,讀者可參考語法卡片進(jìn)行嘗試,本章不再一一贅述。
- 演進(jìn)式架構(gòu)(原書第2版)
- Spring Boot開發(fā)與測(cè)試實(shí)戰(zhàn)
- Java 開發(fā)從入門到精通(第2版)
- PostgreSQL Cookbook
- JavaScript語言精髓與編程實(shí)踐(第3版)
- Java 9 Programming Blueprints
- NativeScript for Angular Mobile Development
- 人人都是網(wǎng)站分析師:從分析師的視角理解網(wǎng)站和解讀數(shù)據(jù)
- Learning Apache Mahout Classification
- Extending Puppet(Second Edition)
- C#程序設(shè)計(jì)(項(xiàng)目教學(xué)版)
- Mastering Python Design Patterns
- 深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理
- Apache Solr for Indexing Data
- Web 2.0策略指南