SAS9

Automatiser la fusion de tables aux noms non-conventionnels

Simon 12 vues
Niveau de difficulté
Débutant
Publié le :
Michael

Le conseil de l'expert

Michael

Face à des imports Excel chaotiques, résistez à la tentation du renommage manuel : c'est une dette technique. La seule méthode industrielle est d'accepter la complexité en utilisant la syntaxe 'Name Literal' ('Nom'n) générée dynamiquement. C’est ce qui transforme un script fragile en un processus robuste, capable d'ingérer n'importe quel fichier sans planter, quels que soient les espaces ou symboles qu'il contient.

Dans l'univers SAS©, il est fréquent de devoir consolider des données historiques stockées dans une même librairie. Si l'opération est triviale avec des noms de fichiers standardisés (ex: DATA_202301, DATA_202302), elle devient périlleuse lorsque les fichiers proviennent d'imports Excel ou de systèmes hérités utilisant des espaces, des symboles ($, &) ou des formats "texte libre".

Cet article vous montre comment concaténer dynamiquement tout le contenu d'une librairie, même lorsque les noms de tables semblent impossibles à manipuler par programmation.

Automatiser la fusion de tables aux noms non-conventionnels -

Le Scénario : Des archives RH en désordre

Prenons l'exemple d'une librairie nommée RH_ARCHIVE. Elle contient des exports mensuels nommés de façon très littérale, incluant des espaces et des caractères spéciaux :

  • 'JANVIER 2024 STAFFING$'

  • 'FEVRIER 2024 - HEURES SUP'

  • 'MARS 2024 & PRIMES'

Si vous tentez une approche classique en récupérant la liste des tables via dictionary.tables pour l'injecter dans une étape DATA, SAS© va échouer.

Pourquoi ? Parce que SAS© interprète 'MARS 2024 & PRIMES' comme trois objets distincts (MARS, 2024, &, PRIMES). De plus, sans référence explicite à la librairie, il cherchera ces tables dans WORK.

Vous obtiendrez inévitablement l'erreur :

ERROR: THE DATA SET NAME CANNOT HAVE MORE THAN 32 CHARACTERS ou ERROR: FILE DOES NOT EXIST.

La Solution : La syntaxe "Name Literal" dynamique

Pour manipuler ces tables, SAS© exige une syntaxe précise appelée "Name Literal" (littéral de nom), qui ressemble à ceci : 'Nom de la table'n. Il faut également impérativement préfixer le nom de la librairie.

Plutôt que d'écrire le code à la main pour chaque fichier, nous allons utiliser PROC SQL pour générer la syntaxe exacte.

Le Code Optimisé

L'objectif est de construire une chaîne de caractères qui ressemble à : RH_ARCHIVE.'JANVIER 2024 STAFFING$'n

Voici le code pour automatiser cela via la fonction CATT :

1/* 1. Construction de la liste des tables avec la syntaxe Name Literal */
2PROC SQL;
3 SELECT catt('RH_ARCHIVE.', quote(MEMNAME), 'n')
4 INTO :LISTE_A_FUSIONNER SEPARATED BY ' '
5 FROM dictionary.tables
6 WHERE LIBNAME = 'RH_ARCHIVE';
7QUIT;
8 
9/* 2. Contrôle du résultat dans la log */
10%PUT &=LISTE_A_FUSIONNER;
11 
12/* 3. Fusion des données */
13DATA CONSOLIDATION_RH;
14 SET &LISTE_A_FUSIONNER.;
15RUN;

Décryptage de la méthode

  • quote(MEMNAME) : Cette fonction entoure le nom récupéré (ex: MARS 2024 & PRIMES) de guillemets doubles. Cela "protège" les espaces et les caractères spéciaux.

  • 'n' : En collant ce suffixe après les guillemets, on indique au moteur SAS© qu'il ne s'agit pas d'une chaîne de texte, mais bien d'un nom de table valide (un littéral).

  • 'RH_ARCHIVE.' : On force l'emplacement de la source. Sans cela, SAS© ne trouverait pas le fichier physique.

  • Cette technique est universelle : elle fonctionne peu importe la "propreté" des noms de vos fichiers sources. Cependant, pour vos futures tables, privilégiez toujours la norme SAS© standard (pas d'espaces, utilisation de l'underscore _, pas de caractères spéciaux) afin de faciliter la maintenance de vos programmes.