Importar Excel con SAS

¿Cómo importar un Excel que nos han pasado para utilizar esos datos con SAS? Esa es la pregunta que vamos a resolver hoy. Lo más directo es importar directamente el Excel que nos interesa con un proc import. Este procedimiento permite importar varios tipos de ficheros para convertirlos en tablas SAS.

La forma más básica para importar un Excel es:

proc import out=tabla
    datafile = "../ficheros/datos.xlsx"
    dbms=xlsx;
    getnames=YES;
run;

En el OUT indicamos la tabla SAS donde queremos guardar la información contenida en el Excel, indicamos la ruta del Excel en el DATAFILE. Es necesario indicar la ruta completa del Excel para evitar errores. El parámetro DBMS indica qué tipo de fichero se está importando y también como se va a transcodificar el contenido del Excel. Para Excel podemos utilizar XLS (para los formatos anteriores a la versión 2007) y XLSX. (Hay otros DBMS para Excel). Finalmente GETNAMES indica que se tomarán los nombres de las columnas contenidas en la primera fila del Excel para los nombres de los campos de la tabla.
Si tenemos un Excel con varias pestañas es necesario entonces indicar qué pestaña deseamos usar. Usaremos el parámetro SHEET.

proc import out=tabla
    datafile = "../ficheros/datos.xlsx"
    dbms=xlsx;
    sheet='numeros_de_telefono';
    getnames=YES;
run;

Cuando los datos colocados en el Excel no comienzan en la casilla A1 sino que están más abajo o más a la derecha puede suceder que la tabla resultante tenga registros vacíos o columnas sin valores. Para evitar esto se puede, entonces, indicar el rango de celdas a importar con el parámetro RANGE y la misma notación que se usa en Excel:

proc import out=tabla
    datafile = "../ficheros/datos.xlsx"
    dbms=xlsx;
    sheet='numeros_de_telefono';
    getnames=YES;
    range = "B2:G1000";
run;

Si no sabemos precisar cuantas filas o columnas tiene la tabla a importar o estas son variables con el tiempo podemos utilizar un rango abierto como por ejemplo: range="B2:"

Para evitar tener que importar muchas pestañas podemos definir una librería apuntando al Excel de forma que las pestañas se visualizarán como tablas dentro de esa librería que representará al Excel entero. La pega de este método es que los parámetros de importación se establecerán por defecto y no podremos personalizar la importación, tendremos que tratar los datos luego. Para definir esta librería utilizamos un libname indicando después del nombre de la librería el parámetro XLSX y luego la ruta y nombre del fichero.

libname excel xlsx "../ficheros/datos.xlsx";

Importar ficheros XML con SAS

En otra entrada previa hemos visto cómo importar ficheros json, en esta nos vamos a fijar en la importación de ficheros xml.

Empezaré diciendo que XML significa «Extensible Markup Language». Son ficheros de texto donde el contenido viene marcado con unas etiquetas con una sintaxis parecida a la del HTML, lo que le confiere una estructura a la información que contiene. En realidad XML es la generalización del lenguaje HTML. El contenido de un fichero XML puede ser tan complejo que más que ser una tabla es más bien una pequeña base de datos con varias tablas relacionadas entre si.

El procedimiento de importación de un XML es parecido al de un json. Se crea una librería donde se importan las distintas tablas de la estructura del fichero.

Para este ejemplo tomaré un fichero de la Agencia Española de Meteorología que publica a través de su web Opendata y revisando la documentación del fichero que publica una organización de estándares llamada OASIS obtengo un fichero XSD que contiene la definición del fichero XML.

Con todo ello cargo los dos ficheros XML y XSD con un filename y a través de un libname creo la librería AEMET que contendrá los ficheros. Estos pueden ser copiados luego normalmente a cualquier otra librería si tienen que ser manipulados.

filename AEMET "&ruta/input/Z_CAP_C_LEMM_20200322101800_AFAZ691703COCO2321.xml";
filename map "&ruta/CAP.xsd";
libname AEMET xmlv2 xmlmap=map automap=replace;

Lo importante aquí en el comando libname es que el parámetro que indica el motor (o tipo) de la librería puede ser xml o xmlv2. Yo he conseguido hacerlo funcionar con la versión 2 y además he tenido que añadir el parámetro automap porque tras varios intentos de importar el XML no me estaba funcionando porque el mapeo del fichero que hizo SAS en un principio parece que no se refrescaba. Esta opción fuerza que vuelva a mapear el fichero con el fichero que le pasamos con el xmlmap.

Este es el resultado de la importación del fichero: una nueva librería AEMET con seis tablas:

libreria_AEMET

El fichero XSD sirve además, normalmente, para hacer una validación del contenido y estructura del XML. Lamentablemente libname no realiza esa función en SAS 9.4.

Importar ficheros JSON con SAS

JSON o JavaScript Object Notation es un formato de ficheros de texto con estructura XML y con notación como la de JavaScript, aunque independiente de este. Alberga información en formato clave – valor, aunque puede contener listas, matrices y otros objetos.

En SAS podemos importar ficheros json con unos comandos bastante simples. Utilizaremos este fichero de ejemplo que guardaré con el nombre colores.json:

"{
"colores": [
{
"rojo":"#f00",
"verde":"#0f0",
"azul":"#00f",
"cyan":"#0ff",
"magenta":"#f0f",
"amarillo":"#ff0",
"negro":"#000"
}
]
}

Los ficheros json se importan en una librería tipo JSON. Primero utilizamos un filename para identificar nuestro fichero y luego con un libname creamos una nueva librería para albergar el contenido de ese json. (he llamado &ruta a la ruta donde he guardado el fichero anterior):

/* Fichero json */
filename fichjs "/&ruta./colores.json";

/* Librería json  */
libname libjs JSON fileref=fichjs;

La librería LIBJS que hemos creando alberga una tabla ALLDATA con todos los pares clave – valor del fichero y otra que se llama COLORES como el objeto descrito en el json.