A menudo sucede, al procesar datos en un servidor (especialmente en Unix), que debemos manipular archivos sin conocer su nombre exacto de antemano, sino más bien su posición en una lista secuencial.
Imagine el siguiente escenario: un directorio contiene una treintena de archivos CSV con nombres secuenciales (por ejemplo a.txt, b.txt, etc.). Su objetivo no es importarlo todo, sino apuntar específicamente al 27º archivo de esta lista, sea cual sea su nombre, para procesar sus datos.
A continuación, se presenta un método robusto para identificar, extraer y leer un archivo específico basándose en su posición, utilizando las funciones del sistema de SAS©.
La estrategia en 3 pasos
Para garantizar que seleccionamos correctamente el 27º archivo en orden alfabético (o secuencial), no podemos confiar en el simple orden de lectura del sistema operativo, que puede ser aleatorio.
El procedimiento a seguir es el siguiente:
Listar el contenido del directorio: Usar las funciones de gestión de archivos de SAS© para leer todos los nombres de archivos presentes.
Ordenar la lista: Ordenar los nombres para asegurar la secuencialidad (de A a Z).
Extraer el archivo objetivo: Usar un acceso directo (puntero) para recuperar el nombre del archivo ubicado en la posición N (en este caso, 27) y almacenarlo en una macrovariable.
Implementación técnica
Pasos 1 y 2: Recuperación y Ordenación
Primero crearemos una tabla SAS© (fnames) que contenga la lista de todos los archivos de la carpeta. Para ello, utilizamos las funciones DOPEN (para abrir el directorio), DNUM (para contar los archivos) y DREAD (para leer los nombres).
Nota importante: Es crucial leer todos los archivos antes de ordenar. Si dejamos de leer en el 27º archivo encontrado por el
Paso 3: Selección directa con la opción POINT=
Una vez que la lista está ordenada, no necesitamos leer toda la tabla. La instrucción SET con la opción POINT= permite ir directamente a la línea deseada.
Este enfoque es universal. Ya sea que busque el archivo 27º o el 100º, la lógica sigue siendo la misma. Una vez que el nombre del archivo se almacena en la macrovariable &mon_fichier, puede usarlo dinámicamente en un procedimiento de importación (como PROC IMPORT) o en un paso de datos clásico para leer el contenido del archivo.