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

Abril 7th, 2008 | por rvaquerizo |

Con anterioridad hemos visto el manejo del ODS y como nos sirve para generar archivos HTML que podemos usar con Excel sin necesidad de emplear el PROC EXPORT. Pero el lenguaje SAS empleado era complicado y requería muchas líneas de código. Pues esto podemos evitarlo si creamos nuestra propia macro para exportar nuestras tablas SAS a tablas Excel.

"Simplemente" hemos de parametrizar el código que vimos en la primera parte del truco SAS. Pero realizaremos diversas modificaciones para que nuestro código sea más práctico:

%macro excel(ubicacion,dataset);option missing=""; 
 
title; 
 
/*ELIMINAMOS LA LIBRERIA SAS DEL NOMBRE*/ 
 
 %let aux1=%scan("&dataset.",2,"."); 
 
/*LAS VARIABLES NUMERICAS IRAN CON FORMATO EUROPEO*/ 
 
 proc contents data=&dataset. 
 
 			  out=_temporal_ (where=(type=1) keep=name type) noprint ; 
 
 run; 
 
/*CREAMOS UNA INSTRUCCION PARA DAR EL FORMATO EUROPEO*/ 
 
 proc sql noprint; 
 
 	select "format "||compress(name)||" commax12.6" into:_instruccion separated by "; " 
 
 	from _temporal_; 
 
 quit; 
 
proc delete data=_temporal_; run; 
 
/*EMPLEAMOS EL PROC PRINT JUNTO CON ODS*/ 
 
 filename _temp_ "&ubicacion.\&aux1..xls"; 
 
title ; 
 
 ods noresults; 
 
 ods listing close; 
 
 ods html file=_temp_ rs=none style=minimal; 
 
 	proc print data=&dataset. noobs; 
 
 	&_instruccion.; 
 
 	run; 
 
 ods html close; 
 
 ods results; 
 
 ods listing; 
 
option missing="."; 
 
%mend excel;

Con esta macro ya disponemos de una función que nos exporta nuestras tablas SAS a Excel. Por ejemplo:

 
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;
%excel(C:\,work.uno);
 

Interesante macro la que os planteo, puede sernos de gran utilidad a la hora de realizar validaciones de ficheros, tabular información, análisis exploratorios,... La interactuación entre SAS y Office nos facilitará nuestro trabajo.

Si tenéis más dudas o sugerencias... rvaquerizo@analisisydecision.es

  1. 13 Respuestas en “Truco SAS. Crear ficheros Excel sin PROC EXPORT (II)”

  2. Por LILIANA, Mar 13, 2009 | Responder

    Como puedo generar una frecuencia de valores perdidos para cada tabla de una librería ya creada, además reemplazar los missing en 0 cuando la variable es numérica y ñ cuando la variable es de carácter

  3. Por rvaquerizo, Mar 16, 2009 | Responder

    He hecho un truco que resuelve tu duda:

    http://analisisydecision.es/trucos-sas-informes-de-valores-missing/

    Para transformaciones de variables tienes:

    http://analisisydecision.es/macros-sas-hacer-0-los-valores-missing-de-un-dataset/

    http://analisisydecision.es/truco-sas-transformaciones-de-variables-con-arrays/

    Estos trucos te servirán para modificar los valores de tus dataset de forma más automática.

  4. Por Marta, Oct 21, 2009 | Responder

    Hola.
    Necesitaría saber cómo puedo hacer para que cada categoría (de productos, por ejemplo) que tengo en mi fichero SAS, se exporte a UNA HOJA DIFERENTE de un mismo fichero Excel.
    Gracias

  5. Por rvaquerizo, Oct 21, 2009 | Responder

    Hola,

    Emplea esta macro para generar N excel en función de la variable categórica. Después tienes http://analisisydecision.es/truco-sas-unir-todos-los-excel-en-uno-solo/ este truco SAS que te une todos los excel en uno.

    Saludos.

  6. Por VICTOR, Jun 25, 2010 | Responder

    PROBE LA MACRO Y ME DICE QUE NO ENCUENTRA EL ARCHIVO AMP.
    NO HE PODIDO RESOLVERLO,

    SI ME PUEDEN AYUDAR SE LOS AGRADECERIA

  7. Por Dani Fernández, Jun 26, 2010 | Responder

    Hola Victor, con ánimo de ayudar me he mirado la macro, la macro es correcta solo que Raul habría escrito este código en algun editor que a la hora de pegarlo se desvirtuó el “&”, es decir, todo lo que diga “&” significa realmente “&” (el &amp significa el ‘ampersand’, y NO es que Raul se olvidara de definir la macro variable ‘amp’).

    El código correcto sería:

    %macro excel(ubicacion,dataset);
    option missing=”";
    title;
    /*ELIMINAMOS LA LIBRERIA SAS DEL NOMBRE*/
    %let aux1=%scan(”&dataset.”,2,”.”);
    /*LAS VARIABLES NUMERICAS IRAN CON FORMATO EUROPEO*/
    proc contents data=&dataset.
    out=_temporal_ (where=(type=1) keep=name type) noprint ;
    run;
    /*CREAMOS UNA INSTRUCCION PARA DAR EL FORMATO EUROPEO*/
    proc sql noprint;
    select “format “||compress(name)||” commax12.6″ into:_instruccion separated by “;”
    from _temporal_;
    quit;
    proc delete data=_temporal_; run;
    /*EMPLEAMOS EL PROC PRINT JUNTO CON ODS*/
    filename _temp_ “&ubicacion.\&aux1..xls”;
    title ;
    ods noresults;
    ods listing close;
    ods html file=_temp_ rs=none style=minimal;
    proc print data=&dataset. noobs;
    &_instruccion.;
    run;
    ods html close;
    ods results;
    ods listing;
    option missing=”.”;
    %mend excel;

    %excel(C:\,work.uno);

    Un saludo,
    Dani Fernandez

  8. Por Dani Fernández, Jun 26, 2010 | Responder

    Travesuras de los editores:
    cuando dije “es decir, todo lo que diga “&” significa realmente “&” ” realmente el primer “&” significaba otra cosa que separo ahora por ‘/’:
    Quise decir:
    todo lo que diga ‘&/a/m/p/;’ significa realmente ‘&’.

    Esto es como explicar a un chino como escribir la ‘ñ’ de España escribiendo en un teclado ruso, que complicado!!!!

    jaja!

  9. Por Noemí, Sep 22, 2011 | Responder

    Hola.
    Me gustaría, con código, poder importar datos desde un fichero Excel ubicado en una determinada uinidad de red. Estos datos están en una fila y columna determinada, y el encabezado no coincide con el nombre de las variables.

    Un saludo,
    Noemí

  10. Por José Antonio Gil Martín, Sep 22, 2011 | Responder

    Noemi lo más fácil es con una sentencia libname, suponiendo que a los datos en Excel le hayas puesto un nombre.

    libname libro ‘c:\datos.xls’ header=yes;

    data sasuser.borrar;
    set libro.rango;
    run;

    libname libro clear;

    En el código anterior se crea una librería llamada libro, esto hace que SAS considere el libro de Excel como si fuera una base de datos y cada una de las hojas como si fuera una tabla.
    rango es el nombre que yo le he puesto al rango de Excel que contiene los datos. Se crea una conjunto de datos en la librería sasuser y por último se desasigna la librería. En lo que respecta a los nombres de las variables SAS tomará los encabezados como nombre de las variables, haciendo los cambios necesarios para que se adapten a la sintaxis de nombres de variables de SAS. Pero una vez en SAS les puedes cambiar fácilmente los nombres por código.

    Espero que te sirva de ayuda. Saludos.

  11. Por rvaquerizo, Sep 23, 2011 | Responder

    Hola, manual al respecto.

    http://www.sas.com/offices/NA/canada/downloads/presentations/GHSUG2009/excel.pdf

    http://www.scsug.org/SCSUGProceedings/2007/papers/how/HOW-Cranford.pdf

    No sé si habrá algún problema con excel 2007. Desde luego no te recomiendo DDE.

  12. Por José Antonio Gil Martín, Sep 26, 2011 | Responder

    Hola, más recursos sobre libname de Excel.

    http://www2.sas.com/proceedings/sugi31/024-31.pdf

    http://www2.sas.com/proceedings/forum2007/119-2007.pdf

    http://support.sas.com/kb/32/455.html

  13. Por Hanf, Oct 13, 2011 | Responder

    Hola,

    Me gustaria saber como cambiar el nombre de los atributos en sas.

    Gracias

  14. Por rvaquerizo, Oct 14, 2011 | Responder

    ¿Podrías ser más concreto con la pregunta?

    No entiendo muy bien a que te refieres.

Publica un Comentario