Truco SAS. Crear ficheros Excel sin PROC EXPORT (I)

No disponemos del módulo ACCESS TO PC FILES y necesitamos poner nuestra tabla SAS en Excel. Usaremos el ODS (Outpus Delivery System) de SAS. Junto con el proc print crearemos un fichero HTML con extensión .XLS que podremos manejar perfectamente con Excel, insisto, no es un fichero Excel, es HTML pero que se manejará sin ningún problema en la hoja de cálculo y que podremos guardar como fichero Excel.

El primer paso para nuestro ejemplo será generar una tabla SAS con valores aleatorios que deseamos exportar a Excel:

data uno; 
do i=1 to 100; 
j=ranpoi(23,3); 
k=ranpoi(123,3); 
l=ranpoi(2,3); 
m=ranpoi(3,3); 
n=l/j; 
uno="hola"; 
y=ranuni(89)*100; 
output; 
end; 
run;

Generamos un dataset aleatorio de 100 observaciones y 8 variables y si observamos el LOG:

NOTA: Division por cero en línea 34 columna 12.
NOTA: Division por cero en línea 34 columna 12.
NOTA: Division por cero en línea 34 columna 12.
NOTA: Division por cero en línea 34 columna 12.
NOTA: Division por cero en línea 34 columna 12.
NOTA: Division por cero en línea 34 columna 12.
NOTA: Division por cero en línea 34 columna 12.
i=101 j=5 k=4 l=2 m=9 n=0.4 uno=hola y=27.716842726 _ERROR_=1 _N_=1
NOTA: Operaciones matemáticas no realizadas en los siguientes lugares. Los resultados de las
operaciones aparecen como valores ausentes.
Cada lugar se introduce por: (Número de veces) en (Línea):(Columna).
7 en 34:12
NOTA: El conj. datos WORK.UNO tiene 100 observaciones y 8 variables.
NOTA: Sentencia DATA utilizado (Tiempo de proceso total):
tiempo real 0.01 segundos
tiempo de cpu 0.01 segundos

SAS nos advierte que hay divisiones con 0 y no se pueden realizar por lo que nuestra variable n tendrá valores missing. Pues bien, el objetivo es exportar esta tabla SAS a una tabla de Excel sin disponer del módulo ACCESS TO PC FILES. Podremos exportarlo en csv y abrirlo con Excel:

PROC EXPORT DATA= WORK.Uno 
OUTFILE= "C:\Temp\borra.csv" 
DBMS=CSV REPLACE; 
RUN;

Con el proc export podemos exportar nuestra tabla SAS a un fichero separado por comas pero necesitamos importar el texto desde Excel y el manejo sería más lento. Del mismo modo sucedería si generamos un fichero de texto separado por tabuladores. Utilizando el ODS vamos a exportar nuestra tabla SAS al directorio C:\temp\ de forma que podamos abrirlo perfectamente con Excel:

title; /*ELIMINAMOS EL TITULO*/ 
filename _temp_ "C:\temp\borra.xls"; /*ASIGNAMOS FILENAME TEMPORAL*/ 
ods noresults; /*NO QUEREMOS OUTPUT*/ 
ods listing close; /*CERRAMOS LISTING*/ 
ods html file=_temp_ rs=none style=minimal; /*SELECCIONAMOS HTML Y ASIGNAMOS UN ESTILO, ESTO SE PUEDE MODIFICAR*/ 
proc print data=uno noobs; /*SIMPLEMENTE REALIZAMOS UN PROC PRINT*/ 
run; 
ods html close; /*REESTABLECEMOS LAS OPCIONES DEL ODS*/ 
ods results; 
ods listing;

En la ubicación deseada disponemos de un fichero con extensión .XLS que podemos abrir y modificar sin ningún problema con Excel. Pero si lo abrimos tenemos algunas limitaciones:

i j k l m n uno y
1 2 2 1 6 0.50000 hola 19.6859
2 2 3 2 1 1.00000 hola 53.1031
3 5 0 3 3 0.60000 hola 1.1549
4 5 2 5 3 1.00000 hola 20.9673
5 5 3 5 3 1.00000 hola 94.3154
6 3 3 3 2 1.00000 hola 67.1307
7 4 4 2 2 0.50000 hola 56.2188
8 5 8 5 3 1.00000 hola 86.6032
9 5 0 5 3 1.00000 hola 71.0829
10 1 1 1 4 1.00000 hola 96.3705
11 1 2 2 5 2.00000 hola 43.0195
12 3 2 7 1 2.33333 hola 13.5442
13 0 5 3 2 . hola 55.2486

Si nuestra conficuración regional es europea la parte decimal de nuestros valores numéricos estarán separados por un . en vez de por , además los valores missing SAS los marca como . cuando deberían estar vacíos. Hemos de modificar más opciones para generar nuestra tabla Excel:

option missing=""; /*LOS VALORES PERDIDOS NO SE MARCAN*/ 
title; /*ELIMINAMOS EL TITULO*/ 
filename _temp_ "C:\temp\borra.xls"; /*ASIGNAMOS FILENAME TEMPORAL*/ 
ods noresults; /*NO QUEREMOS OUTPUT*/ 
ods listing close; /*CERRAMOS LISTING*/ 
ods html file=_temp_ rs=none style=minimal; /*SELECCIONAMOS HTML Y ASIGNAMOS UN ESTILO, ESTO SE PUEDE MODIFICAR*/ 
proc print data=uno noobs; /*SIMPLEMENTE REALIZAMOS UN PROC PRINT*/ 
format n y commax16.1; 
run; 
ods html close; /*REESTABLECEMOS LAS OPCIONES DEL ODS*/ 
ods results; 
ods listing; 
option missing=".";

El resultado ha mejorado mucho:

i j k l m n uno y
1 2 2 1 6 0,5 hola 19,7
2 2 3 2 1 1,0 hola 53,1
3 5 0 3 3 0,6 hola 1,2
4 5 2 5 3 1,0 hola 21,0
5 5 3 5 3 1,0 hola 94,3
6 3 3 3 2 1,0 hola 67,1
7 4 4 2 2 0,5 hola 56,2
8 5 8 5 3 1,0 hola 86,6
9 5 0 5 3 1,0 hola 71,1
10 1 1 1 4 1,0 hola 96,4
11 1 2 2 5 2,0 hola 43,0
12 3 2 7 1 2,3 hola 13,5
13 0 5 3 2   hola 55,2

El código SAS se presenta muy complejo. No compensa crearlo, pero si hacemos nuestra propia función para exportar ficheros a Excel entonces no sería necesario emplear todo el código que os he mostrado anteriormente. Pero esto lo veremos en sucesivas entregas de trucos. Quedaros bien con el uso del ODS que nos va a permitir crear hojas de cálculo con rapidez.

Por supuesto si tenéis cualquier duda o sugerencia podéis contactar conmigo en rvaquerizo@analisisydecision.es

21 comentarios en “Truco SAS. Crear ficheros Excel sin PROC EXPORT (I)

  1. Hola: soy una alumna de doctorado que esta aprendiendo a manejar SAS…llevo 4 dias con el.

    Estoy intentando exportar el contenido de la ventana output porque he probado muchos GLM y quiero encontrar alguna forma de ver los resultados en word o en algun otro programa pero que me permita verlo todo de golpe, no de uno en uno.

    Estoy probando lo que pones en tu pagina (muchas gracias por ponerla disponible) y no se que hago mal. Cualquier consejo o sugerencia…te pego lo que he hecho y el error que me sale… (= es que ya estoy algo saturada…)

    PROC EXPORT data=branch1tree
    outfile=”P:\nelderbranch.xls”
    DBMS=EXCEL REPLACE;
    SHEET=”branches”;
    GETNAMES=YES;
    run;

    /*(TO XLS TO SEE A TABLE…): algo mal con getnames pero al menos tengo una tabla legible en xls
    aparte: se pueden exportar las graficas o todo lo que haya en results de alguna forma que no sea de una en una??*/

    title; /*ELIMINAMOS EL TITULO*/
    filename _temp_ “P:\temp\nelderbranch.xls”; /*ASIGNAMOS FILENAME TEMPORAL*/
    ods results; /*QUIERO EL OUTPUT*/
    ods listing close; /*CERRAMOS LISTING*/
    ods html file=_temp_ rs=none style=minimal;
    proc print data=branch1tree noobs;
    run;
    ods html close;
    ods results;
    ods listing;

    me dice que no existe fisicamente el archivo, pero no estamos creando uno temporal?

    lo siento, pero no me aclaro

  2. Necesito realizar una operación de diferencia entre observaciones de una misma variable, a la ultima observación restarle la anterior a ella, ¿Con que procedimiento lo puedo hacer?quien me pueda responder agradecida de antemano!ya que no logre verlo en la ayuda del SAS.

  3. Una consulta ¿es posible exportar tablas en hojas distintas de un mismo documento Excel?.
    Por ejemplo en la hoja1 que estén los clientes y en la hoja 2 que estén las transacciones entre estos clientes.

  4. Hola a todos

    Estoy intentando exportar un fichero de SAS con 20423 observaciones (de la forma interactiva: File –> Export data), pero se me corta en la observación 16384 y dice que es por excederse el límite…Pero Excel tiene capacidad para 65000 observaciones, por lo que no lo entiendo.

    No me da ningún otro tipo de error. También he intentado hacerlo como indican aquí creando un html que pueda manejar en excel…pero no hay forma.

    Si pueden ayudarme se los agradezco.
    Ángela

  5. Trabajo con SAS (sólo llevo unos 3 meses con él). Al exportar con tabulación parece que ha funcionado y que los datos mantuvieron sus características, pero en cualquier caso: me podría decir a qué se refería cuando me dijo lo de la configuración regional?

    Mil gracias y un saludo

  6. La configuración regional, en este caso, se refiere al uso de . como separador decimal o como separador de miles. SAS siempre emplea la configuración americana, . para decimales , para miles. Pero en Europa lo hacemos justo al revés.

    De este modo cuando se quiere exportar de SAS a Excel se genera un conflicto con los decimales.

    Lo que no entiendo es porque no funciona la macro…

  7. Hay forma de programar desde sas que te duplique una hoja de excel tantas veces como quieras, teniendo ya la hoja padrón definida? Gracias

  8. HOla, como se puede exportar datos con un limite por fichero y que cada vez que alcance dicho limite de registros vuelva a generar otro nuevo con los que faltan por exportar en un fichero plano. Se podria hacer con el proc export? como?gracias

  9. hola, muy bueno el articulo por curiosidad al mismo tiempo puedes pedirle qu ete convierta por ejemplo una variable en formate datetime SAS a date o eso debe ser en el paso data? no me funcionan las clausulas WHERE con DATETIME 20, por ejempolo: WHERE RE_FERE BETWEEN ‘1Jan2014:0:0:0’dt AND ’15Aug2014:0:0:0’dt;

    aunque exigo el dt

    saludos y animos con el blog! me encanta

  10. Buen día, llevo unos días con SAS. Agradecería a quien pudiera darme luz. Quisiera generar un archivo con una tabla de datos, pero deseo que el nombre del archivo sea un compuesto con la fecha del día, pues tengo que realizar ciertas extracciones de datos y no quiero sobreponerlas con la del día anterior ni tampoco deseo estar cambiando el código cada vez que uso la rutina.

    La rutina para crear el nombre específico del archivo lo tengo pero no sé como asociarlo al OUTFILE del proc EXPORT .

    Data _null_;
    y=today();
    format y ddmmyy10.;
    Dia=day(y);
    Dia1= put(Dia, 6.);
    if Dia<10 then dia=CATS(0, Dia1);
    Mes=month(y);
    Mes1= put(Mes, 6.);
    if Mes1<10 then Mes1=CATS(0, Mes1);
    Anno=year(y);
    NOMB_ARCHIV=CATS(Anno, Mes1, Dia1);
    RUTAARCHIVO = CATS("D:\++++ DATOS ++++\2017\VALIDACIONES 2017\EXTRACCION DE DATOS\EXTRACT_DATA_", NOMB_ARCHIV, ".XLS");
    %LET RUTA_ARCHIVO = RUTAARCHIVO;

    PROC EXPORT DATA= Work.Bebidas OUTFILE= &RUTA_ARCHIVO DBMS=EXCEL REPLACE; SHEET="Bebidas"; NEWFILE=YES;

    RUN;

  11. Buenos días,

    Soy novato en SAS y he creado un flujo que tiene una QUERY que se exporta a un .xlsx pero el fichero que crea da el siguiente error: “Excel ha encontrado contenido que no se puede leer “”. Desea recuperar el contenido?” La cosa es que si le doy a SI, el fichero se abre aparentemente sin ningún problema.

    He probado abriendo el fichero creado en distinos ordenadores y me salta el mismo error.

    ¿Como puedo hacer para crear un fichero sin problemas?

    Gracias

    1. Hola, ¿hay algún elemento “extrano” en dataset? Está extraído de un entorno host o algo así por el estilo, puede ser que haya problemas con la codificación de caracteres.

      1. Gracias por responder tan pronto.
        Son 3 tablas que pasan por un constructor de queries, este crea una query de datos unificados de estas tablas y lo exportan a un archivo y este a su vez lo convierte en un .xlsx
        El caso es que si lo exporto a .xls o a .csv no tengo ese problema, pero me gustaría que fuera en .xlsx

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *