張佳佳
(對外經(jīng)濟貿(mào)易大學統(tǒng)計學院,北京 100029)
有一批數(shù)據(jù)文件要被分析,已知文件地址和類型[1-2],可以使用PROC IMPORT 或者在DATA 步中使用INFILE 語句來讀入這些數(shù)據(jù)文件,但必須逐個讀入,即使用宏語句批量讀入也必須知道文件名[3-4]。但SAS 也提供了其他工具來完成以上工作。例如PIPE是兩個進程之間的通信通道,可以通過專門的應用程序向SAS 會話提供信息。X 語句可以在不關閉當前SAS 進程的情況下提交DOS 命令,且可以在DATA 步之外運行。在SAS的傳統(tǒng)應用場景中,先將數(shù)據(jù)手動輸入Excel 或TXT 等文件中,然后傳輸、導入、分析以及輸出[5-6]。但是,這樣處理很難滿足及時性的要求,且人工處理過程也很難避免出錯[7-8]。本研究根據(jù)實際使用場景需求,基于PIPE 和X 語句的功能特點,提供了一種新的思路對數(shù)據(jù)文件進行處理。
SAS 是一種在學術界和工業(yè)界有巨大使用人群的分析工具,使用者常用它來處理分析數(shù)據(jù)、建立模型、質量管理及決策支援,甚至用于地理信息系統(tǒng)。SAS 提供了多種工具幫助使用者處理文件或者與外部應用進行溝通。這是因為在真實研究中,我們面臨的往往是多個數(shù)據(jù)來源、多個數(shù)據(jù)平臺甚至多種數(shù)據(jù)類型,但是不需要每次都開發(fā)一套新的程序來滿足不同數(shù)據(jù)的需求,SAS 提供了多樣化的工具來實現(xiàn)這一功能。多年來,SAS 一直致力于簡化與基本操作系統(tǒng)的接口提供函數(shù)、語句和其他元素,這是為了使用戶不需要知道使用什么命令或如何使用,從而可以方便地把代碼從一個平臺移植到另一個。
PIPE是指在SAS中建立一種信息傳輸?shù)墓艿?,用于建立兩種應用的連接。程序員常常使用這種功能在SAS程序中對外部的某個或某些文件進行操作,然后繼續(xù)進行SAS 程序的運行,不需要停止SAS 程序。PIPE 有兩種形式,即:Unnamed PIPE 和Named PIPE。后者主要處理SAS和其他軟件間的信息交流,前者可以用來調用外部代碼或在不創(chuàng)建中間文件情況下更改輸入、輸出、報錯等信息。本文僅討論第二種,如果對第一種形式的PIPE應用感興趣可以參考SAS documentation。
以具體應用場景為例,如圖1 所示,D: est_result中有一些Excel 文件,文件名未知,可以使用PIPE 功能得到該文件夾下所有的文件名。
首先使用filename語句建立pipe,如下:
filename rc pipe"dir D: est_result*.xlsx/b/s";
圖1 文件夾中的Excel文件
接著在DATA 步中使用infile 語句讀取目標文件夾中的文件信息,然后使用變量res_file存放到數(shù)據(jù)集中,結果如圖2所示。
圖2 DATA步讀取文件名結果
在第一行代碼中,我們建立了一個管道,也就是PIPE,將目標文件夾與SAS連接,只讀取其中的XLSX文件。Filename 語句可以定義一個名字,用這個名字代替一個物理地址(當然也可以用宏變量),在接下來的語句中可以使用這個名字代表的物理地址,讀取其中的文件。其中,dir是DOS命令,可以查看某目錄下的文件,還可以查看文件的信息。*.xlsx 使用了一個通配符,它可以代表所有的xlsx文件。s都是dir命令的參數(shù), 只顯示文件名,s 顯示指定或當前目錄下的所有文件。
PIPE 與SAS 宏的聯(lián)用可以更加方便地處理數(shù)據(jù)文件。在上例中,我們得到了一個數(shù)據(jù)集,這個數(shù)據(jù)集中存放了所有將要處理的數(shù)據(jù)文件的名字,在下面的語句中可以將文件名賦值給一個宏變量。
把剛才兩個功能結合起來,可以實現(xiàn)在一個DATA 步中得到所有待處理文件的文件名,接著在PROC 步中讀取文件,結果如圖3 所示。如果對這些待處理文件的處理方式是統(tǒng)一的,在后續(xù)的步驟中進行逐個處理即可,不過要在前兩個步驟之間將每一個文件名都賦值給一個單獨的宏變量。如果在宏語句中使用一個循環(huán),則可以不必逐個將文件名賦值給宏變量。
將以上步驟嵌入宏程序運行結果,如圖4所示。
圖4 使用宏程序讀入全部Excel文件
可以發(fā)現(xiàn),不需要得到文件名,只需要知道文件存儲的位置和文件的格式即可讀取文件內(nèi)容,即在一個SAS程序中可以對一批文件進行同樣處理。SAS不僅可以使用DOC命令,也可以使用Unix命令,這取決于SAS安裝的機器本身的操作系統(tǒng)。
如果要在一個SAS對話中執(zhí)行DOS命令,可以使用X 語句。X 語句就是以X 開頭的SAS 語句,本質上是打開了CMD,然后打開應用或者對文件夾進行一定操作,也可以在SAS窗口環(huán)境中使用X命令。兩者之間的主要區(qū)別是X 語句像任何SAS 語句一樣提交。但是,X命令是作為窗口環(huán)境命令發(fā)出的。本節(jié)在示例中使用X語句,但是,這些信息也適用于X命令。
當提交X語句時,將臨時退出SAS會話并獲得對Windows命令處理器的訪問權。X語句的語法如下:
X<′command′>;
X mkdir c: est_01;
上例命令的作用是在C 盤中建立一個新的文件夾test_01。如果將宏變量加入其中,則可以建立一個以日期為后綴的新文件夾,結果如圖5所示。
圖5 X語句新建文件夾
這樣操作可以將文件按照日期不同存儲在不同的文件夾中。除此以外,還可以復制文件到目標文件夾。
X copy C:from*.*C: o*.*;
此語句可以將C 盤中from 文件夾中的所有文件拷貝到to 文件夾中。為了避免某個文件被其他用戶使用導致無法被拷貝,在語句中加入另一個參數(shù),指明輸出SAS output 的文件名,從該文件中可以查到是否所有文件都拷貝成功。即:
X“copy c:from*.*C: o*.*>C: eport.txt”;
同理,如果把copy 換成move,就可以將拷貝改成移動。X語句不僅能在個人計算機上使用,如果能與服務器正確連接,還能對服務器上的文件操作,只不過需要對文件的位置進行正確描述。例如,面對一個LINUX管理的服務器可以使用如下語句:
X“copy/home/files/template. xlsx/home/files/output.xlsx”;
X 語句可以采用不同的系統(tǒng)命令對目標文件實現(xiàn)復雜多樣的操作,用戶可以參考DOS命令獲得更多了解。
為了防止在運行其他程序的時候產(chǎn)生錯誤,在使用X 語句之前,應該先判斷一個文件是否存在,然后再進行下一個步驟。如果被操作的文件不存在,在調用運行外部程序的時候會出錯,導致整個SAS程序停止運行。
在判斷文件是否存在時,可以使用DATA 步,也可以使用宏語句。這里使用宏語句是為了對大量文件進行自動處理,而且還可以在log 中生成對用戶有用的警示信息,處理的日志如圖6所示。
圖6 X語句前的處理日志
一般情況下,在對文件進行處理前首先判斷文件是否存在宏程序中的常見操作。日常工作中當用戶面對大量文件的時候,有時候并不知道將要處理的文件是否存在,即便是對將要處理的文件夾提前處理,挑選出要處理的文件,這一步驟也不會省略。這是因為在服務器上的一個文件夾往往有多個用戶,如果文件已經(jīng)被其他用戶移動,提前判斷文件是否存在即可避免SAS 程序意外終止。X 語句還可以使用XWAIT/NOXWAIT, XSYNC/NOXSYNC 等選項控制程序執(zhí)行的時間,發(fā)現(xiàn)錯誤,SAS 會賦值給系統(tǒng)宏變量SYSRC[10-11]。
SAS 擁有強大的數(shù)據(jù)分析的能力,但在日常工作中,分析之前的數(shù)據(jù)處理往往會占用更多的時間。在對這些文件進行處理時,又必須將其保存在其他文件夾下用于后續(xù)分析、比較以及可能的追溯。在進行分析時,還必須準確地定位這些數(shù)據(jù)文件,甚至要根據(jù)數(shù)據(jù)進行不同分析[4,7]。如果人為控制這些過程,必然耗費大量時間,而且難以避免錯誤。使用PIPE 功能可以自動定位查找將要分析的數(shù)據(jù)文件,如果結合宏的功能,還可以動態(tài)地處理數(shù)據(jù)文件,這一過程可以極大地提高效率。同時,X語句可以提交DOS命令對文件或應用進行操作,只需打開SAS 程序,點擊運行即可完成所有的操作,不需要中途退出。對于不熟悉SAS編程的人來說,僅僅需要修改一些文件地址就可以使用已經(jīng)模塊化的程序。