Truco SAS. Crear ficheros Excel sin PROC EXPORT (I)
Abril 2nd, 2008 | por rvaquerizo |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

12 Respuestas en “Truco SAS. Crear ficheros Excel sin PROC EXPORT (I)”
Por Eva, Mar 18, 2009 | Responder
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
Por rvaquerizo, Mar 20, 2009 | Responder
Una cosa, prueba a exportar todas las salidas en un documento RTF que puedes abrir con Word. Puede servirte de guía:
http://support.sas.com/rnd/base/ods/templateFAQ/Template_rtf.html
Por Luis, Ago 2, 2010 | Responder
Y para hacerlo a un txt?
necesito que me saque la tabla y luego una línea en blanco y un pie de página.
gracias
Por janilinarez, Ago 13, 2010 | Responder
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.
Por ffernandez, Ago 14, 2010 | Responder
janilinarez, dispones de las funciones dif() y lag(), si necesitas hacer algo más complejo quizá puedes usar el retain
Por Fernando, Sep 9, 2010 | Responder
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.
Por rvaquerizo, Sep 9, 2010 | Responder
En ese caso tienes que emplear DDE o utilizar el truco que hay de unir excel. Tomo nota
Por Angela, Dic 20, 2011 | Responder
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
Por rvaquerizo, Dic 20, 2011 | Responder
¿Trabajas con Enterprise Guide o trabajas con SAS?
Prueba a exportar a texto delimitado con tabuladores pero ten cuidado con la configuración regional.
Por Angela, Dic 20, 2011 | Responder
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
Por rvaquerizo, Dic 20, 2011 | Responder
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…