公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2007年3月18日 星期日

Run All Your SAS® Programs in One Program: Automatically

原文載點:http://www2.sas.com/proceedings/sugi27/p105-27.pdf

有時候,我們經常把不同的分析寫在不同的程式裡面,時間一久,一個檔案夾裡面就會有很多程式檔。若要執行這些程式,原始的方法就是一個個開啟並且分別執行。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

以本文為例,這個純文字檔將會儲存下列訊息:

sugi105_27

接著執行下列程式碼製造批次檔:

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

2 則留言:

  1. 收到收到
    謝謝Lung-Chang的分享
    我上一篇留言說主執行檔案中要包括macro variable (%let..)
    意思是說所有子檔案都含有一個字串
    這個字串會不斷更新
    所以我不希望每次更新就要進到每個子檔案改一次
    所以照理說我應該可以在主執行檔案中設這個Macro Variable吧?

    回覆刪除
  2. 這個程式只能單純的去執行你已經打包好的小程式。若只有幾個變數要改,那建議你另外寫一個小程式,裡面寫一個macro,把一個%include的指令包起來,讓他去叫你的原始程式,而參數的設定就是你要更改的那個變數。這樣我覺得還比較方便。

    回覆刪除

要問問題的人請在文章下方的intensedebate欄位留言,請勿使用blogger預設的意見表單。今後用blogger意見表單留言的人我就不回應了。

CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }