SAS通過IMPORT過程讀取外部文件數據
使用IMPORT過程導入帶分隔符的文件外,Microsoft Access數據庫文件、Miscrosft Excel工作簿、 dBase文件、JMP文件、SPSS文件、Stata文件、Paradox等。
IMPORT過程的導入數據的基本形式如下:
PROC IMPORT DATAFILE=文件名|文件引用|DATATABLE=表名 DBMS=數據源標識符 OUT=數據集名稱; RUN;
其中:
·DATAFILE=指定輸入文件的完整路徑和文件名,或文件引用。文件引用通常通過FILENAME語句指定。
·DATATABLE=指定輸入DBMS表名。數據源可以通過DATAFILE或DATATABLE指定。
·DBMS=指定要導入的數據類型。SAS支持多種數據類型,例如 CSV、TAB、ACCESS、XLSX、XLS、EXCEL、JMP、DTA、SPSS 等。其中CSV、TAB表示要導入的數據文件分別由逗號和tab符號分隔, ACCESS表示使用LIBNAME語句的Miscrosoft Access表,XLSX表示 Micorsoft Excel 2007或2010的工作簿,等等。可參考SAS幫助文檔了解 關於導入數據類型和各類型的詳細信息。
·OUT=指定輸出的數據集名稱。該語句后面還可以添加數據集選項。
一、插入csv文件
讀取csv文件(逗號分隔的文件)中的數據文件,其中的文件內容如下(可以復制下面建立txt文件):
Name,Age,Position,Marriage,Address Greg William,42,Manager,Single,"14 Bridge St. San Francisco, CA" Emily Cooker, 33, Sales, Married, "42 Rue Marston" Henry Cooper,,Office,Married,"52 Rue Marston Paris" Jimmy Cruze,34,Manager,Single,"Box 100 Cary, NC"
使用如下的方式進行讀取
proc import datafile="E:\SAS\sas base\contact.txt" out=work.contact dbms = csv replace; getnames = yes; datarow=2; run; proc print data=work.contact; run;
GETNAMES語句表示是否從該文件中的第一行讀取變量值,默認為YES,表示讀取;值為NO表示不讀取,這時IMPORT過程 會自動產生名為F1、F2、F3等的變量。
DATAROW=語句也會經常使用,用於指定IMPORT語句開始讀數 據的行號。默認情況下,當GETNAMES=NO時,DATAROW=1,當GETNAMES=YES時,DATAROW=2。該選項用於跳過數據文件開始處的多行內容。
二、讀取Miscosoft Excel工作簿
使用import 讀取下面的excel數據
使用語法如下
proc import datafile = "E:\SAS\sas base\contact.xls" out=work.contact2 dbms = xls replace; run; proc print data=work.contact2; run;
DBMS=XLS或DBMS=XLSX來讀取Excel文件
三、讀取Microsoft Access數據庫文件
Microsoft Access是一個桌面關系型數據庫系統,通常使用Microsoft ACE引擎(.accdb文件格式)或Microsoft Jet引擎(.mdb文件格式)。在 IMPORT過程中指定DBMS為ACCESS,SAS可以讀取在Microsoft Access 97、Microsoft Access 2000、Microsoft Access 2003、MicrosoftAccess 2007和Microsoft Access 2010中的文件。
proc import out=saslib.customer datatable='customer' dbms=access replace; database="c:\sas\data\customer.accdb"; RUN;
四、訪問關系數據庫
SAS支持的關系型數據庫
1.通過LIBNAME語句訪問
接口邏輯庫是通過SAS/ACCESS接口軟件來訪問的其他軟件,例如 數據庫管理系統、格式化的文件等。通過LIBNAME語句指定接口邏輯庫的引用名后,就可以像訪問SAS原生數據集一樣通過二級引用來訪問 數據庫中的表了。這時數據庫中的表也稱為接口數據集。這里簡單介紹 SAS/ACCESS用LIBNAME語句訪問關系型數據庫的一般用法,更詳細的用法請查看SAS幫助文檔。
注意:大多數情況下,接口數據集的使用與原生數據集沒有區別,但仍然會有些限制。
LIBNAME語句指定到DBMS對象的邏輯庫引用名的基本形式如 下:
LIBNAME 邏輯庫引用名 邏輯庫引擎 訪問連接選項;
其中:
·邏輯庫引用名為訪問數據庫的邏輯引用名稱,在本章第一節介紹SAS邏輯庫時有詳細介紹。
·邏輯庫引擎由所要訪問的數據庫確定,例如Oracle數據庫的引擎為oracle,Teradata數據庫的引擎為teradata,Hadoop的引擎為hadoop。
·訪問連接選項提供連接信息並控制SAS如何管理到DBMS鏈接的時 機和並發。不同數據庫,連接選項會不同。例如,連接到Oracle數據的 連接選項為User=、PASSWORD=和PATH=。
下面兩條LIBNAME語句分解建立了到Teradata數據庫和Oracle數據 庫的邏輯庫引用名。接着,就可以使用帶邏輯庫引用名tdlib和oralib的二 級名稱引用數據庫中的表了。
libname tdlib teradata server=tera2650 database=hps user=user1 password=password1;
libname oralib oracle path=mypath schema=myschema user=usr1 password=password1;
2.通過PROC SQL訪問
PROC SQL為SAS軟件實現了結構化查詢語句(Structured Query Language,SQL)。這里主要介紹如何通過PROC SQL使用SAS/ACCESS訪問關系型數據庫。
·使用LIBNAME語句指定接口邏輯庫引用名,然后在PROC SQL語 句中引用該引用名查詢、更新或刪除DBMS數據。
·將LIBNAME信息嵌入PROC SQL視圖中,在每次處理該SQL視圖 時會自動連接到DBMS。
·使用PROC SQL的擴展功能,將DBMS特定的SQL語句直接發送到DBMS,該功能叫作SQL轉交(pass-through)功能。
前兩種方法使用的仍然是SAS/ACCESS LIBNAME引擎,引用數據庫中表的形式與引用SAS原生數據集相同,這里不做介紹。作為 LIBNAME語句的替代,SQL轉交功能使用SAS/ACCESS連接DBMS,並 將語句直接放到DBMS中執行,這樣就可以使用DBMS本身的SQL語法 了。所以,SQL轉交功能支持當前DBMS支持的任何非ANSI標准的 SQL。需要注意的是,不是所有的SAS/ACCESS接口都支持這種屬性。
PROC SQL; CONNECT TO 數據庫名稱 <AS 別名> <(<數據庫連接參數> )>; EXECUTE (數據庫特定SQL語句) BY 數據庫名稱|別名; SELECT 列表 FROM CONNECTION TO數據庫名稱|別名 (數據庫查詢); DISCONNECT FROM數據庫名稱|別名; QUIT;
其中:
·CONNECT語句建立到DBMS的連接。數據庫名稱標識要連接的數 據庫管理系統;別名為該連接指定別名;數據庫連接參數指定PROC SQL連接到DBMS需要的特定的DBMS參數。
·EXECUTE語句發送DBMS特定的、非查詢SQL語句到DBMS。 SAS會把輸入的內容原封不動地發送到DBMS。有些DBMS可能是大小 寫敏感的,需要注意。
·CONNECTION TO組件獲取並使用PROC SQL查詢或視圖中的 DBMS數據。數據庫查詢指定要發送到DBMS上的查詢,該查詢可使用 對該DBMS有效的任何DBMS特定的SQL語句或語法。同樣,這些查詢 對有些DBMS可能是大小寫敏感的。
·DISCONNECT語句終止與DBMS的連接。 各語句執行的返回值和消息保存在宏變量&sqlxrc和&sqlxmsg中。 下面的代碼建立到Oracle數據庫的連接。在CONNECT語句中,
oracle為數據庫名稱,mycon為別名,括號里的內容為數據庫的連接參 數。%put宏將上一條CONNECT語句的返回值和代碼打印到日志窗口。 SELECT語句通過建立的連接將表employees中滿足條件(hiredate>='31- DEC-88')的行指定的5列(empid、lastname、firstname、hiredate、salary)數據取出。
PROC SQL還可以將上面的查詢存儲為SQL視圖或創建為SAS數據集。下面的代碼中查詢條件一樣,還是將查詢存儲為SAS邏輯庫中的 SQL視圖,這樣在下次使用該視圖時就可以自動從數據庫中獲取數據 了。