Los datos provienen de una fuente externa: la lista de archivos de un directorio del sistema operativo, obtenida a través del comando 'dir' (Windows) ejecutado por un 'filename pipe'. Esta información se procesa luego para crear un conjunto de datos SAS interno o se muestra en el log.
1 Bloque de código
DEFINICIÓN MACRO E INICIALIZACIÓN
Explicación : Este bloque define la macro `dirlist` con sus parámetros `path` y `outdn`. También inicializa los valores predeterminados de estos parámetros si no se proporcionan. `%superq` se utiliza para verificar si los parámetros están vacíos, sin intentar resolverlos, lo que evita errores para valores no inicializados.
¡Copiado!
%macro dirlist(path, outdn);
/*set the defualt value of the required params if the value is null*/
%if %superq(path)= %then %let path=&pdir.data;
%if %superq(outdn)= %then %let outdn=_null_;
1
%macro dirlist(path, outdn);
2
/*set the defualt value of the required params if the value is null*/
3
%IF %superq(path)= %THEN %let path=&pdir.DATA;
4
%IF %superq(outdn)= %THEN %let outdn=_null_;
2 Bloque de código
FILENAME PIPE
Explicación : Esta instrucción `filename pipe` es crucial. Crea un fileref llamado `filelist` que, en lugar de apuntar a un archivo físico, ejecuta un comando del sistema operativo (`dir "&path" /o:n /b`) y procesa su salida como un archivo de entrada. `dir /o:n /b` lista los archivos del directorio especificado por `&path` (ordenados por nombre, formato bruto). Es importante señalar que 'dir' es un comando de Windows; para un entorno Linux (común para SAS Viya), sería necesario usar un comando como 'ls'.
Explicación : Este bloque es un paso DATA que lee la salida del comando 'dir' a través del fileref `filelist`. Cada línea de la salida (que corresponde a un nombre de archivo) se lee en la variable `fullname`. Si el parámetro `outdn` es `_null_`, el `fullname` se escribe directamente en el log de SAS. De lo contrario, el código analiza el `fullname` para extraer la extensión (`extname`) y el nombre de archivo sin extensión (`filename`). Las funciones `index`, `scan`, `substr`, `length`, `lowcase` y `call missing` se utilizan para este análisis.
¡Copiado!
data &outdn;
/*The max length of the name of a PC file is 255*/
length fullname $255 %if &outdn ne _null_ %then filename $255 extname $10 ; ;
infile filelist truncover dlm="|";
input fullname;
%if &outdn=_null_ %then put fullname %str(;) ;
%else %do;
if index(fullname, ".") then do;
extname=lowcase(scan(fullname, -1, '.'));
filename=substr(fullname, 1, length(fullname)-length(extname)-1);
end;
else do;
filename=fullname;
call missing(extname);
end;
%end;
run;
1
DATA &outdn;
2
/*The max length of the name of a PC file is 255*/
Explicación : Si se ha especificado un conjunto de datos de salida (`outdn`) (es decir, no es `_null_`), este bloque ejecuta una `PROC SORT`. Este procedimiento ordena el conjunto de datos creado por el paso DATA según la variable `extname` (extensión de archivo), organizando así los archivos por tipo.
¡Copiado!
%if &outdn ne _null_ %then %do;
proc sort data=&outdn;
by extname;
run;
1
%IF &outdn ne _null_ %THEN %DO;
2
PROC SORTDATA=&outdn;
3
BY extname;
4
RUN;
5 Bloque de código
PROC PRINT
Explicación : Después de la `PROC SORT` (si `outdn` no es `_null_`), este bloque utiliza `PROC PRINT` para mostrar el contenido del conjunto de datos `outdn` en la salida de SAS. Se define un título descriptivo para la salida del procedimiento y luego se elimina después de la ejecución. Esto permite visualizar los archivos listados y sus detalles (nombre completo, nombre de archivo, extensión) directamente en la salida de SAS.
¡Copiado!
title "The &path contents";
proc print data=&outdn;
run;
title;
%end;
1
title "The &path contents";
2
PROC PRINTDATA=&outdn;
3
RUN;
4
title;
5
%END;
6 Bloque de código
LIMPIEZA Y FIN DE MACRO
Explicación : Este bloque final es responsable de la limpieza y el cierre de la macro. La instrucción `filename filelist clear;` libera el fileref `filelist`, lo cual es una buena práctica para evitar conflictos o el uso accidental posterior. Finalmente, `%mend dirlist;` marca el final de la definición de la macro `dirlist`.
¡Copiado!
filename filelist clear;
%mend dirlist;
1
filename filelist clear;
2
%mend dirlist;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
Información de copyright : Name : dirlist.sas
Author: Jun Fang June, 2016
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.