2015-10-02 112 views
0

我正在使用runSASJob在UNIX環境中執行SAS程序。SAS命令行 - 部分程序執行

我想知道是否有辦法從命令行執行一部分SAS程序。

例如,假設我有一個100行的SAS程序,並且該程序中有一個數據步驟,佔用5-10行。

只能從命令行運行第5-10行嗎?

感謝

回答

0

下面的宏應該解決這個問題,一些類似的:

%macro runMacroFromEnv 
/des='Set the environment value RUNMACRO to run a macro'; 
    %if %sysfunc(envlen(RUNMACRO)) > 0 %then %sysget(RUNMACRO); 
%mend; 

例如:如果您有以下文件:

%macro foo; 
    %put I just ran foo; 
%mend; 

%macro runMacroFromEnv 
/des='Set the environment value RUNMACRO to run a macro'; 
    %if %sysfunc(envlen(RUNMACRO)) > 0 %then %sysget(RUNMACRO); 
%mend; 

%runMacroFromEnv; 

,並調用SAS:

sas runMacro.sas -set RUNMACRO %foo 

然後在你的日誌的地方,你會看到:

I just ran foo 

一幾個重要細節:

  • 使用-set作品(至少)在Unix和Windows
  • 有設置環境變量,這取決於你的shell
  • 不要忘了%-set RUNMACRO %foo
  • 更多細節
  • The set system option其他機制
1

有多個可用的選項給你:

  1. 打出了5行的利息到一個單獨的文件,然後用%替換它們包括在原來的100行程序語句
  2. 如上所述,但使用自動調用宏或存儲的編譯宏
  3. 編寫一個數據步驟,將100行.sas文件作爲輸入,僅輸出所需的5行,幷包含它% - 如果您有用沒有寫入權限要運行5行的文件,並且不希望保留單獨的副本。
  4. 如果您已經在同一個會話中執行了整個100行程序,則會設置option spool,並且您知道日誌中所需的5行所佔的行號,您可以通過%include語句重播這些行。

選項3,樣本數據的步驟可能是這樣的:

%let SHORTFILE = %sysfunc(pathname(work))/shortfile.sas; 

data _null_; 
    infile "/path/to/100/line/file.sas" obs = 10 firstobs=5 lrecl = 32767; 
    file "&SHORTFILE" lrecl= 32767; 
    input; 
    put _infile_; 
run; 

%include "&SHORTFILE"; 

如果你感覺勇敢,你真的不希望創建一個額外的臨時文件,可以在通話執行要做到這一點,而不是:

data _null_; 
    infile "/path/to/100/line/file.sas" obs = 10 firstobs=5 lrecl = 32767; 
    input; 
    call execute(_infile_); 
run;