Aperçu dictionary : la vision TABLES
Le dictionnaire de données permet de récupérer facilement toutes les métadonnées qui vous sont accessibles : tables dans une librairie, colonnes dans une table, les indexes, les variables macros existantes, les options SAS, les contraintes sur certaines tables, etc.
Il est accessible avec le libref dictionary (le seul que SAS autorise à avoir plus de 8 caractères). C’est en fait un alias sur les tablesSASHELP.V* (ex : dictionary.tables = sashelp.vtable);
Deux tables du dictionnaire sont particulièrement utilisées :
- TABLES : contient toutes les infos sur les tables actuellement définies, c’est-à-dire dont la librairie est assignée
- COLUMNS : contient toutes les infos sur les colonnes de chacune des tables
En résumé, c’est comme si vous faisiez des centaines de PROC CONTENTS en même temps : il y a tellement d’infos qu’on a besoin de les filtrer.
L’exemple suivant affiche le nom, la date de modification, le nombre de lignes et de variables, et l’option de compression des tables (pas les vues, car MEMTYPE = « DATA ») de la libraire SASHELP
proc sql ; create table dic as select MEMNAME, MODATE, NOBS, NVAR, COMPRESS from dictionary.tables where LIBNAME eq "SASHELP" and MEMTYPE eq "DATA" ; quit ;
Le résultat :
Aperçu dictionary : la vision COLUMNS
Une autre table du dictionnaire très utile est COLUMNS. Elle donne tous les détails des métadonnées d’une table.
Comme dans beaucoup d’autres tables du dictionnaire, il est nécessaire de filtrer sur la paire LIBNAME (librairie) et MEMNAME (table).
Attention, petit détail contraignant, comme les champs sont sensibles à la casse, il faut bien penser à mettre le libref et le nom de la table en majuscules ou d’utiliser lowcase()/upcase().
Dans l’exemple suivant, on remarque qu’on peut tout à fait récupérer les métadonnées d’une librairie assignée sur un fichier Excel avec un libname XLSX.
On récupère dans ce cas-ci le nom de la variable, son type, sa longueur, son format et un flag indiquant si un tri la prenant en compte existe :
proc sql ; create table dic2 as select NAME, TYPE, LENGTH, FORMAT, SORTEDBY from dictionary.columns where LIBNAME eq "FICH_XLS" and MEMNAME eq "DATA1" ; quit ;
Dictionary et boucle macro pour faciliter les traitements
Etant donné que l’on récupère facilement les tables membres d’une librairie avec le dictionnaire, on peut le combiner avec un traitement macro pour automatiser une tâche sur toutes les tables d’une librairie.
Explication point par point avec un exemple :
%macro BoucleLibrairie(LIBRAIRIE) ; proc sql ; select count(MEMNAME) into :CNT_TAB trimmed from dictionary.tables where LIBNAME eq "&LIBRAIRIE." ; select MEMNAME into :TAB1 - :TAB&CNT_TAB. from dictionary.tables where LIBNAME eq "&LIBRAIRIE." ; quit ; %put &CNT_TAB. ; %do i=1 %to &CNT_TAB. ; proc contents data=&LIBRAIRIE..&&TAB&i.. ; run ; %end ; %mend BoucleLibrairie ; %BoucleLibrairie(MA_LIBRAIRIE) ;
Étape 1 : On crée la macro %BoucleLibrairie qui reçoit un libref en paramètre
Étape 2 : On compte le nombre de tables dans &LIBRAIRIE et on assigne ce compteur à la macro variable &CNT_TAB (le trimmed sert à enlever les blancs en trop). La syntaxe into :var (les deux points sont importants) sert à stocker une valeur dans une macro variable.
Étape 3 : En utilisant le compteur &CNT_TAB, on assigne à une série de macro variables &TAB1 jusque &TAB<&CNT_TAB> (par ex &TAB20 si &CNT_TAB=20) les noms des tables présentes dans la librairie &LIBRAIRIE. La syntaxe into :var1 – :var10 stocke par exemple 10 valeurs de &var1 jusque &var10.
Étape 4 : En bouclant sur les macro variables &TAB1 jusque &TAB<CNT_TAB>, on peut réaliser un traitement sur chacune des tables de la librairie. On utilise pour cela une variable incrémentée i.
Attention à la syntaxe : à chaque passage dans la boucle, SAS va résoudre &&TAB&i en plusieurs étapes :
- Si &i vaut 1, SAS remplace &i par 1, et && par &, donc &&TAB&i devient &TAB1.
- Tant qu’il y a des macros dans le code, SAS continue de les résoudre. Il va donc remplacer &TAB1 par la valeur récupérée dans la 2è requête SQL.
Pour lire et écrire dans des fichiers Excel avec LIBNAME XLXS : Cliquez ici.