2012-09-24 13 views
5

Tengo una macro que he creado en mi máquina local en un archivo .sas. También tengo un conjunto de datos locales que he estado usando para probar la macro. Este conjunto de datos tiene las mismas descripciones que un conjunto de datos remoto, pero solo menos observaciones. Ahora, estoy tratando de ejecutar mi macro local contra el conjunto de datos remoto. Aquí es básicamente lo que tengo:¿Llamar macro SAS local en el bloque RSUBMIT?

Esto funciona como se esperaba:

%include "C:\my_sas_macro.sas"; 

%my_sas_macro(my_data=work.localdata) 

pero entonces esto genera un error (sigue de error):

%include "C:\my_sas_macro.sas"; 

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

El registro con error:

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. 

Estoy bastante seguro de que necesito transferir de alguna manera el bloque% macro /% remendar al servidor, pero no me puedo imaginar cómo. He visto el %SYSLPUT pero eso es para macro variables y no macros completos.

de todos modos hay que puedo dirigir mi macro en el servidor sin tener que acaba de SSH sobre el código y %include allí?

Gracias!

[Editar] implementado la solución

Así basa en respuesta @ CarolinaJay65 's me ocurrió con la siguiente macro que está funcionando bastante bien para mí hasta ahora.

%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; 

Esto me permite a llamar %include_on_server(file="C:\my_file.sas") y luego se incluye ahora en mi sesión remota.

Respuesta

6

Cómo sobre el uso 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) 

o podría asignar toda la macro a una variable macro a continuación, utilizar% syslput

+0

Gracias, me quedo echa un vistazo a 'Proc Upload;' Para completar, ¿podrías mostrar la forma correcta de "asignar la macro completa a una variable macro"? –

+0

Gracias, esto funciona para mí, pero es una especie de PITA porque tengo que administrar la estructura del directorio en el servidor (no creará automáticamente directorios que no existen). Lo mantendré como la respuesta acceccionada a menos que surja alguna otra solución que no requiera que administre archivos del lado del servidor. –

+1

Agregaría endrsubmit; al final para dejar en claro que todo se ejecuta de forma remota. – vasja

1

Usted tiene varias opciones, una de ellas siendo la sugerencia de CarolinaJay. Otro es si no le importa hacer el procesamiento localmente, puede usar un LIBNAME para referirse a la biblioteca del servidor:

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

si su servidor se llama 'unix' en el script de conexión y desea su directorio de trabajo.

PROC CATOG, o creo que también PROC COPY, puede usarse junto con un libref de servidor como el anterior para copiar el código, ya sea como macro o simplemente como código fuente. Las macros se almacenan en un catálogo (SASMACR), que se puede copiar de una libref a otra (en este caso, de una máquina a otra). También podría almacenar la fuente para crear la macro en un catálogo y mover eso, evitando que tenga que compilar la macro. Sin embargo, esto requiere que los catálogos sean compatibles, lo que depende del tipo de sistema operativo que esté ejecutando en el servidor frente a su máquina local.

Por último, puede seguir las sugerencias en este artículo: http://www.nesug.org/proceedings/nesug05/io/io2.pdf que combina la solución de catálogo y cargar PROC juntos para permitir que las máquinas no compatibles, incluso para trabajar juntos.

+0

+1 ¡Gracias por los grandes detalles! Desafortunadamente para mí, donar el procesamiento local no es una opción ya que necesito trabajar con 12 conjuntos de datos de alrededor de 6GB cada uno. –

+0

La solución PROC CATALOG funcionará bien; luego, solo la parte inicial de la sugerencia fue para el procesamiento local (consulte el PDF). – Joe

1

Ponga un rsubmit/endrsubmit dentro del include, alrededor de la definición de la macro. Cuando incluye el archivo local, cumplirá la macro de forma remota.

EDIT:

es decir

c: \ remote_macro.sas contiene el siguiente:

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

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

A continuación, ejecute lo siguiente en SAS:

%inc "c:\remote_macro.sas" ; 

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

Esto no funciona = (El código en el bloque rsubmit/endrsubmit termina ejecutándose en el contexto del servidor, que luego da el error: 'ADVERTENCIA: el archivo físico no existe ...' y luego 'ERROR: No se puede abrir% INCLUDE archivo C: \ ... '. –

+0

Ver edición con código de ejemplo. Creo que está poniendo el rsubmit alrededor del% inc, no alrededor de la macro dentro del% inc. –

+0

¡Gracias! los bloques 'rsubmit;'/'endrsubmit;' en su archivo de macro, lo que significa que no puede incluirlo localmente, ya que siempre lo enviará remotamente. Estaba buscando una solución que me permitiera incluir un archivo tanto a nivel local como a distancia. –

Cuestiones relacionadas