Truco SAS: Dataset con los ficheros y carpetas de un directorio.
Marzo 3rd, 2008 | por rvaquerizo |En ocasiones necesitamos listar los archivos de un directorio. En SAS se puede hacer así. Creamos una tabla en WORK archivos con los nombres de los archivos y subcarpetas de un directorio:
/*PONE ARCHIVOS DE UN DIRECTORIO EN TABLA SAS*/ %macro archivos(directorio); data archivos; rc=filename('dir',"&directorio."); dirid=dopen('dir'); numarchivos=dnum(dirid); do i=1 to numarchivos; nombrearchivos=dread(dirid,i); output; end; rc=close(dirid); drop rc i; run; %mend archivos;<code> </code></code><code></code><code></code><code>/*EJEMPLO SI QUEREMOS QUE NOS LISTE LAS TABLAS SAS DEL WORK*/ proc sql noprint; select path into:ub_work from sashelp.vlibnam where libname = "WORK"; quit; %archivos(&ub_work.);</code><code> </code><code>data archivos; set archivos; where index(lowcase(nombrearchivos),"sas7bdat")>1; run;
Puede sernos de gran utilidad cuando deseemos importar un gran número de ficheros de texto o si necesitamos manejarnos con archivos y shell, empleamos las funciones de "archivo" de SAS (en breve pondré un artículo sobre las funciones SAS). El programa se puede sofisticar empleando extensiones, eliminando carpetas,... Espero vuestros comentarios y mejoras sobre el uso de esta macro.
Compartiendo conocimientos.

6 Respuestas en “Truco SAS: Dataset con los ficheros y carpetas de un directorio.”
Por Alex, Dic 3, 2010 | Responder
A mi no me funciona esta aplicación.
¿Podrías revisarla a ver si ay algo que este mal?
Gracias.
Por ffernandez, Dic 3, 2010 | Responder
Alex, sería conveniente que nos dieses pistas de qué es lo que no te funciona, porque el problema puede estar en tu equipo y el código funcionar perfectamente en el de Raúl… Revisa el log y dinos cuál es el primer mensaje de error que te genera el código.
Saludos.
Por rvaquerizo, Dic 4, 2010 | Responder
Es evidente porque no te funciona. El problema es de un plugin de wordpress para emplear el código semafórico de SAS. Elimina la parte del código que no es SAS.
Por Alex, Dic 6, 2010 | Responder
ERROR: Información de control de bucle DO no válida, falta la expresión INITIAL o TO, o bien falta
la expresión BY, es cero, o no es válida.
rc=0 dirid=0 numarchivos=. i=1 nombrearchivos= _ERROR_=1 _N_=1
ERROR: La variable gt no está en el fichero WORK.ARCHIVOS.
ERROR 180-322: La sentencia no es válida o no está en el lugar correcto.
Estos son los dos errores.
Si quereis el log entero os lo puedo enviar, pero incluso eliminando la parte que no es codigo no me tira. :(
Por ffernandez, Dic 7, 2010 | Responder
Ojo, no es solo eliminar lo que no es código, también se han cambiado los & por & y gt por >
Por rvaquerizo, Dic 9, 2010 | Responder
Prueba esto:
%macro archivos(directorio);
data archivos;
rc=filename(’dir’,”&directorio.”);
dirid=dopen(’dir’);
numarchivos=dnum(dirid);
do i=1 to numarchivos;
nombrearchivos=dread(dirid,i);
output;
end;
rc=close(dirid);
drop rc i;
run;
%mend archivos;
/*EJEMPLO SI QUEREMOS QUE NOS LISTE LAS TABLAS
SAS DEL WORK*/
proc sql noprint;
select path into:ub_work
from sashelp.vslib
where libname = “WORK”;
quit;
%archivos(&ub_work.);
data archivos;
set archivos;
where index(lowcase(nombrearchivos),”sas7bdat”)>=1;
run;
Es un problema del wordpress y de una castaña de plugin.