Leer múltiples archivos externos en SAS
“¿existe alguna forma de leer varios archivos en un paso DATA sin la necesidad de llamar uno a uno con el INFILE?, es decir quiero leer 25 archivos que contienen un vector clumna cada uno (éstos se encuentran en una carpeta), y luego unirlos para crear un dataset que contenga los 25 vectores columna de los archivos”
Aquí les expongo un pequeño ejemplo de como hacerlo.
Ya que no mencionaste que tipo de archivo es, vamos a asumir que es un csv, la lógica sería la misma para cualquier archivo aunque el código puede cambiar a la hora de leer los archivos en SAS.
Paso 1: Localizar donde están nuestros archivos. Para ello utilizamos la sentencia filename, en el caso de Pablo son 25 archivos externos que si bien son fastidiosos de transcribir en nuestro código también es verdad que no es una tarea imposible. Pero imaginen por un segundo que fueran 500 archivos externos….
filename mfiles pipe ‘dir “C:\Mis Proyectos\*.csv” /b/a’;
Nota: para los que no lo sepan las opciones /b/a son del sistema DOS. No olviden colocar la ruta de sus archivos en lugar de C:\Mis Proyectos\
Paso 2: Colocar toda la información contenida en mfiles en un SAS data set.
Data infolder;
infile mfiles truncover;
input string $20.;
path=cats(“C:\Mis Proyectos\”,string);
filename=strip(scan(string,1,’.'));
run;
Si abren el data set Infolder notaran que tenemos 3 campos:
- String: Contiene la información del archivo leído directamente de la sentencia filename.
- Path:Contiene concatenado la ruta + el nombre del archivo. ej. C:\Mis Proyectos\miarchivo.csv Esta variable será utilizada mas adelante con input para crear nuestros data sets.
- Filename: contiene exactamente la misma información que la variable string pero hemos eliminado el .csv, la idea fundamental aquí es usar esta variable para asignar el nombre a cada data set para que concuerde con el nombre del archivo externo en de realizar cualquier proceso de DQ.
Paso 3: Crear una macro para importar automáticamente todos nuestros archivos externos
%macro ReadIn(input=,output=);
PROC IMPORT OUT= WORK.&output
DATAFILE= “&input”
DBMS=CSV REPLACE;
GETNAMES=YES;
DATAROW=2;
RUN;
%mend;
Como el ejemplo es usando csv, podemos utilizar el proc import sin mayor dificultad. En el caso de ser un arhivo txt o dat podemos utilizar la macro de la siguiente manera:
%macro ReadIn(input=,output=);
Data &output
infile “&input” missover;
Input /*Aqui tus variables*/
run;
%mend;
La macro variable &output contiene la info de la variable filename y &input contiene la info referente a la variable path.
Paso 4: Invocamos la macro para generar nuestros archivos.
Data _null_;
set infolder;
call execute(‘%ReadIn(input=’!!path!!’,output=’!!filename!!’)');
run;
Una vez alcanzado este punto, el método que se eliga para unir todos los data sets y crear un solo data set es a juicio del facultativo.
Espero les sirva!
SASludos,
Alberto
ALBERTO, MUCHAS GRACIAS POR LA SOLUCIÓN, ME HA CAIDO DE PERLAS.ESTAMOS EN CONTACTO.