Il arrive souvent, lors de traitements de données sur serveur (notamment sous Unix), que l'on doive manipuler des fichiers sans connaître leur nom exact à l'avance, mais plutôt leur position dans une liste séquentielle.
Imaginez le scénario suivant : un répertoire contient une trentaine de fichiers CSV nommés de manière séquentielle (par exemple a.txt, b.txt, etc.). Votre objectif n'est pas de tout importer, mais de cibler spécifiquement le 27ème fichier de cette liste, quel que soit son nom, pour en traiter les données.
Voici une méthode robuste pour identifier, extraire et lire un fichier spécifique basé sur sa position, en utilisant les fonctions système de SAS©.
La stratégie en 3 étapes
Pour garantir que nous sélectionnons bien le 27ème fichier dans l'ordre alphabétique (ou séquentiel), nous ne pouvons pas nous fier au simple ordre de lecture du système d'exploitation, qui peut être aléatoire.
La procédure à suivre est la suivante :
Lister le contenu du répertoire : Utiliser les fonctions de gestion de fichiers SAS© pour lire tous les noms de fichiers présents.
Trier la liste : Ordonner les noms pour assurer la séquentialité (A vers Z).
Extraire le fichier cible : Utiliser un accès direct (pointeur) pour récupérer le nom du fichier situé à la position N (ici, 27) et le stocker dans une macro-variable.
Implémentation technique
Étape 1 et 2 : Récupération et Tri
Nous allons d'abord créer une table SAS© (fnames) contenant la liste de tous les fichiers du dossier. Nous utilisons pour cela les fonctions DOPEN (pour ouvrir le dossier), DNUM (pour compter les fichiers) et DREAD (pour lire les noms).
Note importante : Il est crucial de lire tous les fichiers avant de trier. Si l'on s'arrête de lire au 27ème fichier trouvé par l
Étape 3 : Sélection directe avec l'option POINT=
Une fois la liste triée, nous n'avons pas besoin de lire toute la table. L'instruction SET avec l'option POINT= permet d'aller directement à la ligne souhaitée.
Cette approche est universelle. Que vous cherchiez le 27ème ou le 100ème fichier, la logique reste la même. Une fois le nom du fichier stocké dans la macro-variable &mon_fichier, vous pouvez l'utiliser dynamiquement dans une procédure d'importation (comme PROC IMPORT) ou une étape Data classique pour lire le contenu du fichier.