對于統(tǒng)計程序員來說,根據(jù)mock shell產(chǎn)生各種統(tǒng)計圖表是工作中很重要的部分。我們在產(chǎn)生統(tǒng)計圖表時,往往會將圖標的標題以及腳注填寫到一份EXCEL表格中,便于我們后期的輸出。
我們可以手動填寫標題以及腳注信息,但是這么做效率并不高。為了節(jié)省時間,我們可以通過VBA以及SAS編程來讀取mock shell中的標題以及腳注信息。

mock shell示例
我們可以看到,一份mock shell文件主要由標題、三線表格、腳注組成。對于產(chǎn)生標題腳注文件時,三線表格是多余的信息,會干擾我們下一步的編程。因此我們選擇使用WORD自帶的VBA來進行處理。
Sub Removetables ()
Dim oTable As Table
For Each oTable In ActiveDocument.Tables
oTable.Delete
Next oTable
End Sub
Sub DeleteImage()
For Each ishape In ActiveDocument.InlineShapes
ishape.Delete
Next ishape
For Each ishape In ActiveDocument.Shapes
ishape.Delete
Next ishape
End Sub
以上的VBA代碼,目的是清除mock shell文件中的表格以及圖片信息。之后我們選擇將清楚了表格圖片信息后的mock shell另存為文本文件(.txt file)。接著我們使用SAS讀取文本文件。
data WORK.TEST;
%let _EFIERR_ = 0;
infile 'filename.txt' delimiter='09'x MISSOVER DSD lrecl=32767 ;
length var1 $20000;
informat VAR1 $20000. ;
informat VAR2 $24. ;
informat VAR3 best32. ;
format VAR1 $20000. ;
format VAR2 $24. ;
format VAR3 best12. ;
input
VAR1 $
VAR2 $
VAR3
;
if _ERROR_ then call symputx('_EFIERR_',1);
run;

讀取的數(shù)據(jù)集
data test1;
set test;
where var1 ne "";
n=_n_;
proc sort;
by n;
run;
data test2;
retain nn 0;
set test1;
by n;
nn=nn;
if substr(upcase(var1,1,5)) in ("TABLE","FIGUR","LISTI") then nn=nn+1;
proc sort;
by nn n;
run;
proc transpose data=test2 out=test3;
by nn;
var var1;
run;
我們接著選取VAR1不為空的紀錄,并通過觀測序號確定數(shù)據(jù)集排序順序,以便于后期的轉(zhuǎn)置。并根據(jù)數(shù)據(jù)的實際情況進行一定的處理。在處理好之后,我們進行轉(zhuǎn)置,即可得到標題腳注信息。