2012-09-24 60 views
5

我已經在我的本地機器上創建了一個.sas文件中的宏。我也有一個已經用來測試宏的本地數據集。該數據集與遠程數據集具有相同的描述符,但只有較少的觀察值。現在,我正試圖運行我的本地宏對遠程數據集。這基本上是我有:在RSUBMIT塊中調用本地SAS宏?

這按預期工作:

%include "C:\my_sas_macro.sas"; 

%my_sas_macro(my_data=work.localdata) 

但隨後這會產生一個錯誤(錯誤如下):

%include "C:\my_sas_macro.sas"; 

rsubmit; 
%my_sas_macro(my_data=remotelib.remotedata) 
endrsubmit; 

日誌,錯誤:

125 %include "C:\my_sas_macro.sas"; 
136 
137 rsubmit; 
NOTE: Remote submit to REMOTEID.__7551 commencing. 
WARNING: Apparent invocation of macro MY_SAS_MACRO not resolved. 
83 %my_sas_macro(my_data=remotelib.remotedata) 
    - 
    180 
ERROR 180-322: Statement is not valid or it is used out of proper order. 
84 endrsubmit; 

NOTE: Remote submit to REMOTEID.__7551 complete. 

我很確定我需要以某種方式將%宏/%修補塊轉移到服務器,但我無法確定如何。我已經看到%SYSLPUT,但這是宏變量而不是完整的宏。

無論如何,我可以在服務器上運行我的宏,而不必通過代碼SSH和%include那裏嗎?

謝謝!

[編輯]實施的解決方案

因此,基於@ CarolinaJay65的答案,我想出了下面的宏這是迄今爲止的工作非常適合我。

%macro include_on_server(file=); 
%let server_file = ~/temp.sas; 
%SYSLPUT macro_file=&file; 
%SYSLPUT server_file = &server_file; 

rsubmit; 

proc upload 
    infile= "&macro_file." 
    outfile= "&server_file." 
; run; 

%include "&server_file."; 
endrsubmit; 

%mend include_on_server; 

這使我只是叫%include_on_server(file="C:\my_file.sas"),然後它現在包含在我的遠程會話。

回答

6

如何使用Proc Upload

rsubmit; 
Proc Upload 
    infile='C:\my_sas_macro.sas' 
    outfile='//server/my_sas_macro.sas' ; 
run; 

%include '//server/my_sas_macro.sas'; 
%my_sas_macro(my_data=remotelib.remotedata) 

,或者你可以指定整個宏宏變量,然後使用%syslput

+0

謝謝,我會請檢查'Proc Upload;'爲了完整性,您能否展示「將整個宏指定給宏變量」的正確方法? –

+0

謝謝,這適用於我,但它是一種PITA,因爲我必須管理服務器上的目錄結構(它不會自動創建不存在的目錄)。除非有其他解決方案出現,否則我會將其保留爲接受答案,這不需要我管理服務器端的文件。 –

+1

我想添加endrsubmit;最後要說清楚,所有的都是遠程執行的。 – vasja

1

您有幾種選擇,其中之一是CarolinaJay的建議。另一種情況是,如果您不介意在本地執行處理,則可以使用LIBNAME來引用服務器庫:

libname server = slibref =; so libname myserver server = unix slibref = work;

如果您的服務器在連接腳本中被命名爲'unix'並且您想要它的工作目錄。

PROC CATALOG,或者我認爲PROC COPY也可以和上面的服務器libref一起使用來複制代碼,無論是作爲宏還是作爲源代碼。宏存儲在目錄(SASMACR)中,可以從一個libref複製到另一個目錄(在這種情況下,從一臺機器到另一臺機器)。您也可以將源代碼存儲在目錄中以創建宏,並移動該宏,從而避免您必須編譯宏。但這確實要求目錄兼容,這取決於您在服務器上運行的操作系統類型與本地計算機的類型。

最後,你可以按照本文的建議: http://www.nesug.org/proceedings/nesug05/io/io2.pdf 該目錄的解決方案和PROC UPLOAD結合在一起,以允許甚至不兼容的設備協同工作。

+0

+1感謝您的精彩細節! Unfortunatley對我來說,donig本地處理不是一種選擇,因爲我需要使用12個每個大約6GB的數據集。 –

+0

PROC CATALOG解決方案將正常工作,然後 - 只有建議的初始部分用於本地處理(請參見PDF)。 – Joe

1

將一個rsubmit/endrsubmit包含在宏定義的周圍。當你包含本地文件時,它將遠程地與宏進行比較。

編輯:

C:\ remote_macro.sas包含如下:

rsubmit ; 
    %MACRO MYMACRO ; 
    /* do stuff */ 
    %MEND ; 

    %MACRO ANOTHERMACRO(PARAM) ; 
    /* Do other things */ 
    %PUT &PARAM ; 
    %MEND ; 
endrsubmit ; 

然後運行SAS如下:

%inc "c:\remote_macro.sas" ; 

rsubmit ; 
    %MYMACRO ; 
    %ANOTHERMACRO(Hello World) ; 
endrsubmit ; 
+0

這不起作用=(rsubmit/endrsubmit塊中的代碼最終會在服務器上下文中執行,然後出現錯誤:'警告:物理文件不存在...',然後是'錯誤:無法打開%INCLUDE文件C:\ ...' –

+0

請參閱使用示例代碼進行編輯,我認爲您將%inc放在rsubmit周圍,而不是在%inc的宏內 –

+0

謝謝!你的宏文件中的'rsubmit;'/'endrsubmit;'塊意味着你不能在本地包含它,因爲它總是遠程提交它。我正在尋找一個解決方案,使我能夠包含一個文件無論是本地還是遠程。 –