SAS: Procedimiento proc contents

El procedimiento proc contents sirve para obtener información de las tablas y librerías. Produce un informe que puede presentarse en la pestaña output de SAS Enterprise Guide o puede volcarse todo en una tabla con el parámetro out=. Volcar esa información en una tabla permite utilizar la información recogida en tiempo de ejecución.
Pero, vamos a empezar por el principio:

proc contents data=SASHELP.CLASS;
run;

En este ejemplo utilizamos la tabla CLASS de la librería de ejemplos de SAS (SASHELP) que está presente en las instalaciones de SAS por defecto para obtener un informe en la pestaña «output» del contenido de la tabla. Entre otras cosas que no incluyo aparece un listado de los campos de la tabla:

Podemos enviar este listado de campos, junto con otra información adicional relevante a una tabla SAS, en vez de a ese informe. Para ello determinamos una tabla de salida con out=. Y como no nos interesa la salida en el informe, además incluimos el parámetro noprint:

proc contents data=SASHELP.CLASS
    out=SALIDA noprint;
run;

En la tabla que hemos obtenido tendremos la siguiente información (entre otra):

Variable Explicación
LIBNAME Nombre de la librería donde se encuentra la tabla.
NAME Nombre del campo de la tabla.
TYPE Código numérico que indica de que tipo es la variable. 1 = numérico o fecha y 2 = texto.
LENGTH Tamaño del campo en bytes.
VARNUM El número de orden de la variable dentro de la tabla. Es recomendable ordenar la salida por esta variable.

Podremos utilizar la información aquí almacenada para saber por ejemplo si la tabla que hemos cargado tiene un campo ID como número o como texto; o si una fecha que hemos importado ha quedado como fecha o simplemente se ha quedado como una cadena de texto. Podremos resolver esos problemas de importación desde aquí.
En siguientes artículos explicaré como podemos solucionar cada uno de esos problemas en un artículo con un código SAS completo.

Comprobar si existe un campo en una tabla SAS

En ocasiones necesitamos saber si existe un fichero o una tabla y para ello utilizamos la función exist, pero ¿qué pasa si queremos saber si en la tabla que estamos procesando hay un determinado campo?

Es una situación menos habitual y lo malo es que no existe una función para evaluarlo directamente, así que nos toca remangarnos y usar un poco nuestra imaginación.

Existen varias soluciones para abordar esto, seguro que cada una más adecuada en según qué circunstancias. En este caso vamos a evaluar si en la tabla SASHELP.US_DATA tenemos el campo «capital» y os propongo varias soluciones:

La primera que se me ocurre es utilizando vectores:

%macro comprobar_variable1(campo_buscado=);
    %let dsid = %sysfunc(open(SASHELP.US_DATA));
    %let rc = %sysfunc(fetchobs(&dsid,1));
    %let r1 = %sysfunc(varnum(&dsid,&campo_buscado));
    %let r2 = %sysfunc(varnum(&dsid,&campo_buscado));
    %let resultado = %sysfunc(max(&r1>0,&r2>0));
    %put &=resultado;
    %let rc = %sysfunc(close(&dsid));
%mend;

%comprobar_variable1(campo_buscado=CAPITAL);
%comprobar_variable1(campo_buscado=region);

Otra solución aparentemente más sencilla de programar sería utilizando proc contents. A mi me resulta muy útil este procedimiento para resolver muchos problemas de automatización de procesos.

%macro comprobar_variable2(campo_buscado=);
    proc contents data=SASHELP.US_DATA out=VARIABLES (keep=name) noprint;
    run;

    proc sql noprint;
        select count(1) into :resultado
        from VARIABLES
        where name=upcase("&campo_buscado");
    quit;

    %put &=resultado;
%mend;
%comprobar_variable2(campo_buscado=CAPITAL);
%comprobar_variable2(campo_buscado=region);

Os propongo que enviéis alguna más que se os pueda ocurrir.