有時候,我們經常把不同的分析寫在不同的程式裡面,時間一久,一個檔案夾裡面就會有很多程式檔。若要執行這些程式,原始的方法就是一個個開啟並且分別執行。Ling Y. Chen 和 Steven A. Gilbert 在 2002 年的 SUGI 27 發表了一篇文章,教導使用者如何批次執行所有的程式。
首先假設你的 SAS 是安裝在 C:\SAS 的路徑下,而 SAS 程式碼則是儲存在 C:\chen 路徑下。一般來說,在 DOS 環境下來執行一個 SAS 程式需要以下這一行指令:
C:\SAS\SAS.exe -sysin C:\chen\prog1.sas
如果有很多 SAS 程式在 C:\chen 路徑下,要使用一個批次檔(.bat)來執行數個 SAS 程式,就需要在批次檔內分別為每個程式寫一行 DOS 指令:
Start/w C:\SAS\SAS.exe –sysin C:\chen\prog1.sas
Start/w C:\SAS\SAS.exe –sysin C:\chen\prog2.sas
Start/w C:\SAS\SAS.exe –sysin C:\chen\prog3.sas
一旦程式很多,一行一行地寫實在很浪費時間。如果能有個方法去讓這個批次檔自動產生上述指令,那就相當方便了。這個步驟其實很簡單。首先,我們要先知道到底在這個路徑下有多少個 SAS 程式。用一個方法把這些檔名都記錄下來,可以用下面這個 DOS 指令生出一個純文字檔:
dir C:\ >proglist.txt
以本文為例,這個純文字檔將會儲存下列訊息:
接著執行下列程式碼製造批次檔:
Filename proglist ‘c:\proglist.txt’;
data progs;
infile proglist;
input @1 var1 $ @10 var2 $;
run;
data progs;
set progs;
char=”start/w c:\sas\sas.exe –sysin
c:\chen”;
var3=char||compress(var1)||’.sas’;
where var2=’SAS’;
run;
不過作者們很好心的寫了個 macro,讓使用者只需要指定路徑檔案夾名稱以及一個不是太重要的資料集名稱就可完成上面所用動作:
%macro genlist (folder=, dsn=);
x “dir &folder > &folder\proglist.txt”
Filename proglist “&folder\proglist.txt”;
data progs;
infile proglist;
input @1 var1 $ @10 var2 $;
run;
data &dsn;
set progs;
char=”start/w c:\sas\sas.exe –sysin
&folder”;
var3=char||compress(var1)||’.sas’;
where var2=’SAS’;
run;
%mend genlist;
範例如下:
%genlist (folder=C:\chen, dsn=chen);
%genlist (folder=C:\gilbert, dsn=gilbert);
CONTACT INFORMATION
Your comments and questions are valued and encouraged.
Contact the author at:
Ling Yun Chen
Rho, Inc.
199 Wells Ave, Suite 302
Newton, MA 02459
617-965-8000 x26
Fax: 617-965-8014
lchen@rhoworld.com
收到收到
回覆刪除謝謝Lung-Chang的分享
我上一篇留言說主執行檔案中要包括macro variable (%let..)
意思是說所有子檔案都含有一個字串
這個字串會不斷更新
所以我不希望每次更新就要進到每個子檔案改一次
所以照理說我應該可以在主執行檔案中設這個Macro Variable吧?
這個程式只能單純的去執行你已經打包好的小程式。若只有幾個變數要改,那建議你另外寫一個小程式,裡面寫一個macro,把一個%include的指令包起來,讓他去叫你的原始程式,而參數的設定就是你要更改的那個變數。這樣我覺得還比較方便。
回覆刪除