Subido por adan.uribe

lenguajemacroensasporcarlosromojarorincc3b3n24062012

Anuncio
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<= valor>;
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
Descargar