SAS9

Cómo seleccionar y leer el N-ésimo archivo de un directorio Unix con SAS

Simon 7 vues

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©.

Cómo seleccionar y leer el N-ésimo archivo de un directorio Unix con 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:

  1. Listar el contenido del directorio: Usar las funciones de gestión de archivos de SAS© para leer todos los nombres de archivos presentes.

  2. Ordenar la lista: Ordenar los nombres para asegurar la secuencialidad (de A a Z).

  3. 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

1DATA fnames;
2 LENGTH dref $8 fname $200;
3 /* 1. Assigner le répertoire à un fileref */
4 rc = filename(dref, "/chemins/vers/mon_dossier");
5
6 /* 2. Ouvrir le répertoire */
7 did = dopen(dref);
8
9 /* 3. Boucler sur tous les fichiers présents */
10 IF did THEN DO i = 1 to dnum(did);
11 fname = dread(did, i);
12 OUTPUT; /* Ajoute le nom à la table */
13 END;
14
15 /* Fermeture propre du répertoire */
16 rc = dclose(did);
17 keep fname;
18RUN;
19 
20/* 4. Trier les fichiers par nom pour garantir l'ordre séquentiel */
21PROC SORT DATA=fnames;
22 BY fname;
23RUN;

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.

1DATA _null_;
2 /* Définir la position cible */
3 pt = 27;
4
5 /* Vérifier si le fichier existe (gestion d'erreur) */
6 IF pt > nobs THEN DO;
7 putlog "Erreur : Pas assez de fichiers dans le dossier.";
8 stop;
9 END;
10 
11 /* Accès direct à la 27ème observation */
12 SET fnames point=pt nobs=nobs;
13
14 /* Stocker le nom dans une macro-variable pour usage ultérieur */
15 call symputx('mon_fichier', fname);
16
17 /* Arrêter l'étape data immédiatement après la lecture */
18 stop;
19RUN;
20 
21/* Vérification dans la log */
22%put Le fichier sélectionné est : &mon_fichier;

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.