官术网_书友最值得收藏!

  • SAS編程演義
  • 谷鴻秋
  • 2112字
  • 2020-11-28 17:42:30

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)行嘗試,本章不再一一贅述。

主站蜘蛛池模板: 象山县| 团风县| 巫山县| 肇源县| 盐边县| 昭苏县| 麦盖提县| 遵化市| 彭阳县| 疏附县| 宽甸| 高陵县| 乐都县| 汶川县| 榆树市| 唐海县| 神农架林区| 罗甸县| 尤溪县| 嵊泗县| 准格尔旗| 太仓市| 巧家县| 宁安市| 定安县| 常山县| 枞阳县| 巩留县| 隆尧县| 昌邑市| 九龙城区| 古丈县| 富平县| 四子王旗| 齐河县| 红安县| 龙里县| 罗平县| 渝北区| 甘泉县| 浦县|