Trucos SAS. Lista de datasets en macro variable

Un uso frecuente del proc sql es la generación de macro variables. En este ejemplo vamos a crear una macro variable con el nombre de los dataset de una librería SAS que empiecen por un determinado sufijo. También es un ejemplo bastante práctico del uso de las vistas de SASHELP. Creo que es un ejemplo bastante sencillo y sobre él iremos generando nuevos trucos que espero puedan serviros. Para entender mejor el truco vamos a generar 20 ficheros “ficticios” con variables aleatorias en el directorio c:\temp de nuestro PC:

*GENERAMOS 2 DATASETS ALEATORIOS;
%macro tablas_aleatorias;
%do i=1 %to 20;
data temp.aleat&i.;
do i=1 to 100;
persona=ranpoi(8,23);
importe1=int(rand("uniform")*1000);
importe2=int(rand("uniform")*1000);
tae=ranpoi(34,2)+round(rand("uniform"),.1);
output;
end;
drop i;
run;
%end;
%mend;

%tablas_aleatorias;

Esta macro hace un bucle y genera 20 datasets aleatorios. A continuación necesitamos crear un dataset que sea la concatenación de los 20 generados anteriormente. Podríamos poner los 20:

data aleat;
set temp.aleatorio1 temp.aleatorio2 temp.aleatorio3 temp.aleatorio4
temp.aleatorio5 temp.aleatorio6 temp.aleatorio7 temp.aleatorio8
temp.aleatorio9 temp.aleatorio10 temp.aleatorio11 temp.aleatorio12
temp.aleatorio13 temp.aleatorio14 temp.aleatorio15 temp.aleatorio16
temp.aleatorio17 temp.aleatorio18 temp.aleatorio19 temp.aleatorio20 ;
run;

Pero esto no es elegante porque somos profesionales que aprendemos trucos de SAS con Raúl. Para automatizar esto debemos hacer lo siguiente:

*SELECCIONAMOS LOS DATASET QUE EMPIECEN POR ALEAT;
proc sql noprint ;
select compress(libname||"."||memname)
into: lista_tablas separated by " "
from sashelp.vtable
where memname like '%ALEAT%' and libname = "TEMP";
quit;

*PODEMOS HACER UNA TABLA QUE SEA UNION DE TODOS LOS DATASET;
data aleat;
set &lista_tablas.;
run;

La macro variable lista_tablas contiene todos los dataset de la librería temp que empiezan por el sufijo aleatorio. Evidentemente podemos modificar el sufijo e incluso la libería. Incluso podemos crear una macro a medida:

%macro seleccion(sufijo,libreria);
proc sql noprint ;
select compress(libname||"."||memname)
into: lista_tablas separated by " "
from sashelp.vtable
where index(memname,upcase("&sufijo."))>0 and libname = upcase("&libreria.");
quit;
%mend;

%seleccion(aleat,temp);

Para la macro empleamos index en vez de like, si alguien intenta hacerlo con like entenderá este cambio de funciones.

Por supuesto, si alguien tiene dudas, sugerencias… rvaquerizo@analisisydecision.es

8 comentarios en “Trucos SAS. Lista de datasets en macro variable

  1. rvaquerizo, excelente truco, me ayudo muchisimo, muchas gracias, estoy iniciando en el manejo de este software y tu pagina es una de las que voy a utilizar para ampliar mis conocimientos, saludos

  2. Buenos días,
    Estaba probando el mismo codigo que nos muestras dentro de una macro, y al poner un
    %put con la lista, en vez de darmela me dice lista…
    Te dejo el codigo por si le puedes echar un vistazo:

    %macro crear_lista(tab,var,vlista);

    proc sql noprint;
    select &var. into: &vlista. separated by ” ”
    from &tab.;
    quit;
    %put &vlista.;

    %mend;
    %crear_lista(&Tab_tipos. , name , vlista1 );

    Muchas Gracias!!!

  3. Que es lo que pasa? con la macro variable si la select no devuelve nada. ¿Qué valor toma?

    proc sql;
    select extension into :f_proces1 separated by ‘ ‘
    from DTEMP.ficheros_ROP00050 where control = “OK”;

    quit;

    en el siguiente proc se realizará solo si f_proces1 no es nulo y no se como controlarlo, porque de todos modos me da error.

    %macro tratar_ROP00050;
    %let i=0;

    %IF (&f_proces1 ~= “”) %THEN %DO;
    %PUT “SOL2 &f_proces1”;
    %end
    %mend tratar_ROP00050;

    gracias

Deja un comentario

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

[bws_google_captcha]