Story Transcript
LENGUAJE MACRO EN SAS
Carlos Romojaro Rincón
INDICE
0. Introducción 0.1. ¿Qué es el lenguaje macro? (pg. 4)
1. Variables macro 1.1. Introducción (pg. 5) 1.2. Sintaxis (pg. 6) 1.3. Un primer uso (pg. 7) 1.4. Las variables macro (pg. 10) 1.4.1. Normas de uso (pg. 11) 1.4.2. La sentencia %LET (pg. 12) 1.4.3. Salida en Log (pg. 12) 1.4.4. Variables macro automáticas (pg. 15) 1.4.5. Ejemplos útiles (pg. 19) 1.5. Concatenación y referencias indirectas (pg. 20) 1.5.1. Tipos de concatenación (pg. 20) 1.5.2. Referencias indirectas (pg. 24) 1.6. Ámbito de las variables macro (pg. 26) 1.7. Destrucción de variables macro (pg. 28)
2.1. Introducción (pg. 31) 2.1.1. Sintaxis (pg. 31) 2.1.2. Paso de valores a programas macro (pg. 35) 2.1.3. Pequeñas herramientas para depurar (pg. 44) 2.2. Elementos y técnicas macro avanzadas (pg. 50) 2.2.1. Funciones macro (pg. 51) 2.2.1.1. Creación de funciones macro. (pg. 56) 2.2.2. Sentencias automatizadas (pg. 57) 2.2.2.1. Selectivas (pg. 59) 2.2.2.2. Iterativas (pg. 62) 2.2.3. Almacenamiento permanente de programas macro (pg. 64)
Carlos Romojaro Rincón
Programas macro
2. Programas macro
3
¿Qué es el lenguaje macro?
El lenguaje macro en SAS es una herramienta implementada dentro del lenguaje SAS con la que se puede:
Crear código reutilizable fácilmente. Pasar información entre diferentes pasos en SAS. Potenciar el código mediante sentencias iterativas y condicionales. Reducir considerablemente la cantidad de código del programa.
El lenguaje macro se compone de su propia sintaxis en la que los tonkens por excelencia son:
% para indicar al procesador que se trata de una sentencia macro. & para indicar al procesador el uso de una variable macro ya creada.
Como mas adelante veremos, este token indica al preprocesador de SAS que se trata de una sentencia correspondiente al lenguaje macro.
Variables macro
Una de las características que hace más versátil a este lenguaje es el poder implementarse fuera de cualquier procedimiento SAS. Lo que permite potenciar de una manera eficaz la ejecución de procedimientos a nuestro antojo.
Carlos Romojaro Rincón
4
1.1.
Introducción a las variables macro
Para la comprensión del término variable macro diremos que se trata de una variable texto normal, la cual tiene un comportamiento similar a una variable texto (string) del lenguaje SAS. Las variables macro son una de las partes fundamentales de todo el lenguaje macro, otorga una gran versatilidad a los programas y son fáciles de usar. La sintaxis general para el uso de una variable macro será: %LET DIA = LUNES; DATA PRUEBA; INPUT PERSONA PIEZAS; DATALINES; 1 10 2 15 3 9 ; TITLE "PRODUCCIÓN DEL &DIA"; PROC PRINT DATA = PRUEBA; RUN;
PRODUCCIÓN DEL LUNES Obs 1 2 3
PERSONA 1 2 3
PIEZAS 10 15 9
Carlos Romojaro Rincón
Variables macro
La salida de este programa será:
5
Hemos visto en el ejemplo anterior que el procesador macro concatena dentro de un string la variable macro indicada. Este es uno de los funcionamientos de las variables macros, aunque tiene más, que se explicaran detalladamente más adelante.
1.2.
Sintaxis
Este tipo de variables deben de ser inicializadas antes de ser usadas. Para hacerlo se deberá escribir la siguiente sentencia: %LET nombrevariable; Nombrevariable es un valor obligatorio y valor es un parámetro opcional. Por otro lado, el uso de la misma se realiza de la siguiente forma: &nombrevariable; Con la sentencia anterior se le indica al procesador macro que quiere usarse esa variable.
Variables macro
El procesador macro, resolverá la variable como un valor texto y lo unirá si este está acompañando un texto u otras sentencias.
Carlos Romojaro Rincón
6
1.3.
Un primer uso de las variables macro
Para poder empezar a vislumbrar el potencial que por ahora podemos sacar de las variables macro se acompaña este capítulo de varios ejemplos: DATA ALMACEN; INPUT PROVEEDOR PIEZAS SEMANA; DATALINES; 1025 200 20 5612 150 5 4124 210 10 8496 200 5 7455 150 5 8499 500 9 5485 2 5 ; RUN; %LET AX =6; PROC CHART DATA=ALMACEN; VBAR PIEZAS /AXIS=&AX; PROC CHART DATA=ALMACEN; VBAR SEMANA /AXIS=&AX; RUN;
Variables macro
La salida correspondiente:
Carlos Romojaro Rincón
7
En este ejemplo hemos usado la variable macro AX en varios procedimientos diferentes. Esto es una de las grandes virtudes de las variables macro, puesto que nos permite compartir la misma variable en multitud de procedimientos diferentes que no permiten ni el uso de variables convencionales. Siguiendo con el ejemplo anterior, vemos que con cambiar solamente una vez el valor de la variable AX, podemos modificar el aspecto de los dos gráficos al mismo tiempo. Además vemos otro de los funcionamientos de las variables macros además de la concatenación visto antes, la asignación. Veamos otro ejemplo: DATA ALMACEN; INPUT PROVEEDOR PIEZAS SEMANA; DATALINES; 1025 200 20 5612 150 5 4124 210 10 8496 200 5 7455 150 5 8499 500 9 5485 2 5 ; RUN; %LET AX= 6; %LET SEMAX= 10; PROC CHART DATA=ALMACEN; VBAR PIEZAS /AXIS=&AX; WHERE SEMANA < &SEMAX; PROC CHART DATA=ALMACEN; VBAR SEMANA /AXIS=&AX; WHERE SEMANA < &SEMAX; RUN;
La salida en este caso será:
Carlos Romojaro Rincón
Variables macro
QUIT;
8
Variables macro Carlos Romojaro Rincón
9
1.4.
Las variables macro
Llegados a este capítulo ya tenemos unas nociones de los que son las variables macro, de su uso y de sus posibles aplicaciones dentro de nuestros programas SAS. Por lo que nos centraremos más en sus propiedades y características. Como se dijo en un principio, las variables macro son variables texto, así es como se almacenan en memoria. Veremos más adelante que existen formas de hacer casting a otros tipos de datos (interger y punto flotante). Si por ejemplo contiene un número que será usado en una operación matemática, el procesador macro la convierte automáticamente en una variable numérica. Se puede observar en el siguiente ejemplo. Pero no siempre ocurrirá asi. %LET VALOR = 10; DATA VALORES; INPUT X; COEFICIENTE = X/ &VALOR; DATALINES; 1 3 6 3 ; PROC PRINT DATA=VALORES; RUN;
La salida resultante:
1 2 3 4
X 1 3 6 3
COEFICIENTE 0.1 0.3 0.6 0.3
Pero como vimos en ejemplos anteriores, el procesador macro también puede hacer concatenaciones automáticas si la variable macro se usa por ejemplo dentro de un string o en el nombre de un paso data como en el siguiente ejemplo:
Carlos Romojaro Rincón
Variables macro
Obs
10
%LET DIA = 12; DATA ALMACEN_DIA&DIA; INPUT PROVEEDOR PIEZAS SEMANA; DATALINES; 1025 200 20 5612 150 5 4124 210 10 8496 200 5 ; PROC PRINT DATA = ALMACEN_DIA12; RUN
1.4.1.
Normas de uso
Como todas las variables usadas en lenguajes de programación, las variables macro tienen sus propias normas para ser nombradas, creadas y referenciadas dentro del programa: El nombre no puede empezar por un valor numérico. El nombre no puede superar 32 caracteres. La variable tiene una capacidad de 65 Kbytes. Pueden ser referenciadas en cualquier parte del código. El token para declararla y modificarla es %LET El token para referenciarla es & Si se quieren concatenar dentro de un texto, este debe estar encerrado entre comillas dobles. No se pueden asignar valores a las variables macro automáticas. Su uso está sujeto a normas de ámbito. No pueden contener como nombre caracteres reservados por el sistema.
Carlos Romojaro Rincón
Variables macro
11
1.4.2 La sentencia %LET La sentencia %LET nos permite definir variables y modificar su valor. Es una sentencia perteneciente al código macro, por lo que solo la ejecutará el procesador macro. Las variables macro, no soportan el valor missing. En caso de que una variable macro no contenga ningún valor, se considerará como un valor NULL. Otra característica de la sentencia %LET, es que no asigna a las variables macro valores en blanco, los omite. Veamos un ejemplo con dos sentencias %LET, las cuales acaban asignando el mismo valor NULL a las dos variables: %LET NULO=; %LET NULO=
;
Pero también omite los valores en blanco antes o después de otros valores: %LET VARIABLE= PRUEBA; %LET NULO=
PRUEBA ;
En caso de que queramos por cualquier motivo almacenar valores en blanco, es necesario recurrir a funciones quoting que serán explicadas en el próximo capítulo.
Este tipo de variables, cuando se usan dentro de un paso data, no se imprimen en la ventana OUTPUT como ocurre con las variables convencionales de SAS. Por lo que si queremos que se impriman en esta ventana deberá ser asignándoselas primeramente a una variable convencional de SAS. No obstante, habrá ocasiones donde nos interese que la información se imprima en la ventana Log. A continuación se explican los procedimientos para hacerlo con lenguaje macro.
Carlos Romojaro Rincón
Variables macro
1.4.3 Salida en Log
12
Tenemos dos opciones: %PUT SYMBOLGEN Ambas sentencias no necesitan estar dentro de un procedimiento para que funcionen, basta con que estén dentro del programa a ejecutar. Estas sentencias son muy útiles para depurar los programas en busca de errores o malas optimizaciones. La sentencia %PUT, tiene el mismo comportamiento que su homóloga en código SAS convencional, la sentencia PUT. La sintaxis por lo tanto será de la siguiente forma:
%PUT &nombrevariable;
Como se puede observar, la diferencia entre las dos sentencias es el token%. Como ya veremos en el próximo capítulo, una gran cantidad de sentencias del lenguaje macro se diferencian únicamente del lenguaje SAS convencional por esta precedidas del token %. A continuación vemos un ejemplo del uso de la sentencia %PUT:
%LET FECHA = 17/06/2012;
Como se puede observar del ejemplo anterior, con la sentencia %PUT, no hace falta encerrar el texto entre comillas, puesto que el procesador macro ya considera que todo lo que vaya tras la sentencia %PUT hasta que se acabe la línea con el token punto y coma, será texto. Las variables macro serán resueltas como texto automáticamente.
Con la sentencia %PUT también podemos realizar un escaneo de todas las variables que componen un tipo determinado e imprimirlas en el LOG. La sintaxis será:
Carlos Romojaro Rincón
Variables macro
%PUT INFORME A FECHA: &FECHA
13
En primer lugar la sentencia %PUT, seguida de alguna de estas opciones:
_automatic_ _all_ _user_ _global_ _local_
De toda esta lista, cabe mencionar la opción _user_ la cual nos mostrara en el LOG todas las variables macro creadas por el usuario. Además de _automatic_ con un funcionamiento igual al anterior pero con las variables automáticas que veremos más adelante. Otra sentencia que nospermitirá imprimir información en la ventana LOG será la sentencia SYMBOLGEN. Esta sentencia imprime en la ventana LOG todas las variables macro que se usen (salvo cuando se use la sentencia &LET) en el programa, a diferencia de la sentencia %PUT en la que se imprimen las que explícitamente se indiquen. La sintaxis es muy sencilla, y simplemente hay que poner la siguiente sentencia, a partir de la cual la opción symbolgen estará activada:
OPTIONS SUMBOLGEN;
Para deshabilitar la opción symbolgen y que dejen de aparecer las variables en la ventana LOG, basta con escribir la siguiente sentencia:
RUN;
Variables macro
OPTIONS NOSYMBOLGEN;
Carlos Romojaro Rincón
14
A continuación vemos un ejemplo:
%LET FECHA = 18/06/2012; %LET NOMBRE = CARLOS; OPTIONS SYMBOLGEN; %PUT HOY ES &FECHA; %PUT MI NOMBRE ES &NOMBRE
La salida en la ventana LOG es:
1 %LET FECHA = 18/06/2012; 2 %LET NOMBRE = CARLOS; 3 4 OPTIONS SYMBOLGEN; 5 6 %PUT HOY ES &FECHA; SYMBOLGEN: La macro variable FECHA se resuelve en 18/06/2012 HOY ES 18/06/2012 7 %PUT MI NOMBRE ES &NOMBRE SYMBOLGEN: La macro variable NOMBRE se resuelve en CARLOS 8 9 RUN;
1.4.4 Variables macro automáticas
Cabe mencionar que no se puede crear ninguna variable con el nombre de alguna de las variables automáticas, ni con palabras reservadas por el sistema SAS. Por ejemplo:
SYS SYSDAY SIS SISDAY
Carlos Romojaro Rincón
Variables macro
Son variables macro con información relativa al sistema donde esté instalada la plataforma SAS, al propio sistema SAS y a la sesión SAS con la que se trabaje en ese momento.
15
Hay tres tipos de variables macro automáticas: Permanentes Semi-Permanentes Editables
El primer tipo, son variables que contienen información del sistema, que se carga al momento de iniciar la sesión SAS y que no cambian hasta que se cierra esta. Algunas son:
Variable SYSDATE
SYSDATE9 SYSDAY SYSVER SYSTIME
Descripción Contiene la fecha de la sesión SAS, que corresponde con la del sistema donde se ejecute la plataforma. Está en formato DATE7. Igual que el anterior pero la fecha se muestra en formato DATE9. Devuelve el día en formato texto. Almacena la versión de la plataforma SAS. Almacena el momento en el que se inició la sesión SAS actual.
El segundo tipo lo forman las variables que al igual que las anteriores contienen información del sistema, pero el propio sistema puede modificarlas durante la sesión. Algunas son:
Carlos Romojaro Rincón
Descripción Devuelve un código de los errores que se puedan producir. Algunos valores son: 0
La ejecución del programa se realizó con éxito.
1
La ejecución del programa fue cancelada por el propio usuario por una sentencia RUN CANCEL.
2
La ejecución del programa fue
Variables macro
Variable SYSERR
16
cancelada por el propio usuario por un comando ATTN o BREAK. 3
SYSLIBRC
Error producido en modo no interactivo o en ejecución por lotes.
Devuelve el código de la última librería creada en la actual sesión SAS.
El tercer tipo de variables automáticas lo componen variables creadas por el sistema SAS, pero que pueden ser editadas por el usuario durante la sesión SAS. Algunas son:
Variable SYSDNS
SYSLAST
Descripción Nombre del último data set creado en la actual sesión SAS. Se almacena con un espacio en blanco separando la librería y el nombre del data set: WORK PRUEBA Igual que el anterior pero el carácter de separación es un punto: WORK.PRUEBA
Permisos
Variable
Permisos
Variable
Lectura y escritura
SYSBUFFR
Lectura y escritura
SYSPARM
Lectura y escritura
SYSCC
Lectura y escritura
SYSPBUFF
Lectura y escritura
SYSCMD
Lectura y escritura
SYSRC
Lectura y escritura
SYSDEVIC
Solo lectura
SYSCHARWIDTH
Carlos Romojaro Rincón
Variables macro
La lista de variables macro automáticas es muy extensa, a continuación se muestra una lista con algunas más relevantes, en este caso clasificadas según su permiso de escritura:
17
Variable
Permisos
Variable
Lectura y escritura
SYSDMG
Solo lectura
SYSDATE
Lectura y escritura
SYSDSN
Solo lectura
SYSDATE9
Lectura y escritura
SYSFILRC
Solo lectura
SYSDAY
Lectura y escritura
SYSLAST
Solo lectura
SYSENCODING
Lectura y escritura
SYSLCKRC
Solo lectura
SYSENV
Lectura y escritura
SYSLIBRC
Solo lectura
SYSERR
Lectura y escritura
SYSLOGAPPLNAME
Solo lectura
SYSERRORTEXT
Lectura y escritura
SYSMSG
Solo lectura
SYSHOSTNAME
Solo lectura
SYSSCPL
Solo lectura
SYSINFO
Solo lectura
SYSSTARTID
Solo lectura
SYSJOBID
Solo lectura
SYSSTARTNAME
Solo lectura
SYSMACRONAME
Solo lectura
SYSTCPIPHOSTNA ME
Solo lectura
SYSMENV
Solo lectura
SYSTIME
Solo lectura
SYSNCPU
Solo lectura
SYSUSERID
Solo lectura
SYSODSPATH
Solo lectura
SYSVER
Solo lectura
SYSPROCESSID
Solo lectura
SYSVLONG
Solo lectura
SYSPROCESSNAME
Solo lectura
SYSVLONG4
Solo lectura
SYSPROCNAME
Solo lectura
SYSWARNINGTEXT
Solo lectura
SYSSCP
Solo lectura
SYSINDEX
Solo lectura
SYSSITE
Para terminar este apartado, se acompaña un ejemplo del uso de las variables macro automáticas:
Carlos Romojaro Rincón
Variables macro
Permisos
18
DATA ALMACEN_&SYSDATE; INPUT PROVEEDOR PIEZAS SEMANA; DATALINES; 1025 200 20 5612 150 5 4124 210 10 8496 200 5 ; TITLE "ALMACEN A FECHA: &SYSDATE"; PROC PRINT DATA = ALMACEN_&SYSDATE; RUN;
Y la salida será:
1 2 3 4
1025 5612 4124 8496
200 150 210 200
SEMANA 20 5 10 5
1.4.5 Ejemplos útiles
Una forma bastante útil de dar provecho a las variables macro fuera de un programa macro es usándolas como herramienta para ejecutar ciertas partes del programa de una manera sencilla:
Carlos Romojaro Rincón
Variables macro
ALMACEN A FECHA: 01JAN12 Obs PROVEEDOR PIEZAS
19
%LET COMENINI1= * ; %LET COMENINI2= / ; %LET COMENFIN= /* ; LIBNAME VV 'E:\'; &COMENINI1.&COMENINI2 DATA ESTUDIOHOMBRES; SET VV.HOMBRES; &COMENFIN RUN;
&COMENINI1.&COMENINI2 PROC FREQ DATA=ESTUDIOHOMBRES; TABLES CINE; &COMENFIN RUN;
En el capitulo 2 se verá una forma mas sencilla de hacer esto.
1.5.
Concatenación y referencias indirectas
El uso principal de las variables macro es la concatenación, ya sea con texto o con otras variables macro.
1.5.1.
Tipos de concatenación
El lenguaje macro permite tres tipos de situaciones al concatenar variables macro con texto:
Texto antes de la variable macro Texto después de la variable macro Varias variables macros seguidas
Carlos Romojaro Rincón
Variables macro
Como hemos visto en ejemplos anteriores, para concatenar variables macro con texto no hacía falta el uso de ningún comando concatenador. Pero existen circunstancias en las que esto no es así.
20