Truco SAS. Tablas de una librería en una macro variable

Me plantean una duda, como crear un conjunto de datos con las tablas de una librería en sas y posteriormente generar una macro variable con ellos, esta es una entrada análoga a otra del blog pero sirve para recordar como funciona el ODS de SAS y el PROC DATASETS un procedimiento que no he usado habitualmente. Lo primero que vamos a hacer es observar que resultados arroja el PROC DATASETS en su sintaxis más sencilla, ver los contenidos de una librería:

[source languaje=»SAS»] ods trace on;
proc datasets lib=datos;
quit;
ods trace off;[/source]

Recordamos que ODS (Output Delivery System) TRACE ON nos permite ver en la log de SAS los elementos que se obtienen como resultado, en este caso, el más sencillo, tenemos:

Output Added:
————-
Name: Directory
Label: Directory Information
Template: Base.Datasets.Directory
Path: Datasets.Directory
————-

Output Added:
————-
Name: Members
Label: Library Members
Template: Base.Datasets.Members
Path: Datasets.Members
————-

Evidentemente nos interesa Members para poner en una tabla SAS todos los miembros de la librería:

[source languaje=»SAS»]
ods output Members=tablas;
proc datasets lib=datos ;
quit;
[/source]

Ahora tenemos que meter en una macrovariable todos los elementos del campo name de la tabla SAS que hemos generado. Para ello en vez de emplear el habitual PROC SQL podemos usar una concatenación sobre los valores de name que diera como resultado final la macrovariable con la lista de las tablas:

[source languaje=»SAS»]
data _null_;
length mv $2550.;
set tablas end=fin;
retain mv "";
mv = trimn(mv)||’ ‘||compress(name) ;
if fin then call symput (‘lista_tablas’,mv);
run;

%put &lista_tablas.; [/source]

En este paso data es interesante el uso de LENGTH al principio para garantizarnos un buen número de bits para nuestra macrovariable y el uso de RETAIN para crear una sucesión de concatenaciones donde es importante emplear TRIMN para evitar que los espacios en blanco nos generen problemas. En el ejemplo no se genera conjunto de datos SAS con DATA _NULL_ pero si queréis ver como se genera la variable escalonada que acumula a name generad una tabla SAS y entenderéis mejor como funciona. Habrá quien opine que estos pasos son más sencillos que los que puse en la entrada de 2009 pero yo prefiero el PROC SQL.