Optimisez vos scripts SAS : Automatisez la récupération des attributs de table (NOBS, NVAR, CRDATE)

Niveau de difficulté
Débutant
Publié le :
Michael

Le Conseil de l'Expert

Michael
Responsable de l'infrastructure Viya.

L'accès aux métadonnées via la vue SASHELP.VTABLE combiné à l'instruction %SYSCALL SET représente le summum de l'efficacité pour le pilotage dynamique de flux SAS. Contrairement à une étape DATA classique qui créerait une table physique intermédiaire, cette macro utilise les fonctions d'ouverture de bas niveau (%sysfunc(open)) pour mapper directement les colonnes du dictionnaire SAS vers des variables macro. C'est une technique d'expert indispensable pour l'automatisation, permettant par exemple de vérifier le nombre d'observations (_nobs) ou la date de modification (_modate) avant de décider de lancer un traitement lourd.

La subtilité technique ici réside dans l'utilisation de %SYSCALL SET(dsid). Cette commande lie automatiquement les variables macro locales aux colonnes de la vue ouverte ; dès que %sysfunc(fetchobs) est exécuté, toutes les métadonnées de la table ciblée sont instantanément chargées dans les variables correspondantes sans aucune extraction manuelle. C'est une méthode extrêmement propre qui minimise les ressources CPU et mémoire, tout en offrant une traçabilité parfaite grâce aux journaux (%put) générés.

Une astuce d'expert pour optimiser ce code : puisque vous utilisez des variables globales pour stocker les résultats finaux, assurez-vous de toujours vérifier que le descripteur dsid est différent de zéro. Si la table n'existe pas, dsid vaudra 0 et les fonctions suivantes échoueront. Ajouter un test conditionnel sur la valeur de retour de open rendra votre macro totalement robuste pour un environnement de production.

Cette macro prend en entrée une bibliothèque (lib) et un nom de table (dsn). Elle utilise la vue `sashelp.vtable` pour rechercher les informations correspondantes. En utilisant les fonctions `%sysfunc(open)`, `%sysfunc(fetchobs)` et `%sysfunc(close)`, elle lit l'enregistrement de métadonnées de la table et assigne les valeurs (telles que le nombre d'observations, le nombre de variables, la date de création, etc.) à une série de variables macro globales prédéfinies (ex: `_nobs`, `_nvar`, `_crdate`). Les valeurs récupérées sont également affichées dans le journal SAS© à des fins de débogage.
Analyse des données

Type : SASHELP


La macro interroge la vue système `sashelp.vtable` pour obtenir les métadonnées de la table demandée par l'utilisateur. Elle ne crée pas de données et ne lit pas de fichiers externes directement.

1 Bloc de code
Macro
Explication :
Ce bloc définit la macro `%utl_getTable`. Il déclare des variables macro locales et globales. La partie centrale ouvre la table `sashelp.vtable`, y recherche la table spécifiée via les paramètres `lib` et `dsn`, récupère la première (et unique) observation correspondante, puis ferme la table. Les valeurs des colonnes de `vtable` sont ensuite assignées aux variables macro globales correspondantes à l'aide de `%let` et `%qtrim` pour supprimer les espaces superflus. Finalement, des instructions `%put` affichent les valeurs des variables globales dans le journal pour vérification.
Copié !
1%macro utl_getTable(lib,dsn)
2 /des="get table attributes meta data";
3/*--- OUTPUT MACRO VARIABLES
4 _LIBNAME
5 _MEMNAME
6 _MEMTYPE
7 _MEMLABEL
8 _TYPEMEM
9 _CRDATE
10 _MODATE
11 _NOBS
12 _OBSLEN
13 _NVAR
14 _FILESIZE
15 _DELOBS
16 _NLOBS
17 _NUM_CHARACTER
18 _NUM_NUMERIC
19---*/
20 /*--- for testing withou macro
21 %let lib=sashelp;
22 %let dsn=class;
23 ---*/
24 %global
25 _libname
26 _memname
27 _memtype
28 _memlabel
29 _typemem
30 _crdate
31 _modate
32 _nobs
33 _obslen
34 _nvar
35 _filesize
36 _delobs
37 _nlobs
38 _num_character
39 _num_numeric ;
40 %local
41 LIBNAME
42 memname
43 memtype
44 memlabel
45 typemem
46 crdate
47 modate
48 nobs
49 obslen
50 nvar
51 filesize
52 delobs
53 nlobs
54 num_character
55 num_numeric ;
56 
57 %let dsid=%sysfunc(open(sashelp.vtable
58 (where=(
59 upcase("&lib") = upcase(LIBNAME)
60 and upcase("&dsn") = memname)),i));
61 
62 %syscall SET(dsid);
63 
64 %let rc=%sysfunc(fetchobs(&dsid,1));
65 %let rc=%sysfunc(close(&dsid));
66 
67 %let _libname = %qtrim(&LIBNAME );
68 %let _memname = %qtrim(&memname );
69 %let _memtype = %qtrim(&memtype );
70 %let _memlabel = %qtrim(&memlabel );
71 %let _typemem = %qtrim(&typemem );
72 %let _crdate = %qtrim(&crdate );
73 %let _modate = %qtrim(&modate );
74 %let _nobs = %qtrim(&nobs );
75 %let _obslen = %qtrim(&obslen );
76 %let _nvar = %qtrim(&nvar );
77 %let _filesize = %qtrim(&filesize );
78 %let _delobs = %qtrim(&delobs );
79 %let _nlobs = %qtrim(&nlobs );
80 %let _num_character = %qtrim(&num_character);
81 %let _num_numeric = %qtrim(&num_numeric );
82 
83 %put ---- inside &=_libname ;
84 %put ---- inside &=_memname ;
85 %put ---- inside &=_memtype ;
86 %put ---- inside &=_memlabel ;
87 %put ---- inside &=_typemem ;
88 %put ---- inside &=_crdate ;
89 %put ---- inside &=_modate ;
90 %put ---- inside &=_nobs ;
91 %put ---- inside &=_obslen ;
92 %put ---- inside &=_nvar ;
93 %put ---- inside &=_filesize ;
94 %put ---- inside &=_delobs ;
95 %put ---- inside &=_nlobs ;
96 %put ---- inside &=_num_character;
97 %put ---- inside &=_num_numeric ;
98%mend utl_getTable;
L'Astuce Pro
Pour optimiser la performance de cette macro, utilisez l instruction %SYSCALL SET(dsid) de preference a une boucle de lecture manuelle : cette technique de programmation macro avancee lie directement toutes les colonnes de la vue SASHELP.VTABLE a des variables macro de meme nom en une seule operation, ce qui permet d extraire instantanement des metadonnées complexes comme le nombre d observations (nobs) ou la taille du fichier (filesize) sans avoir a declarer chaque transfert de valeur individuellement.
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.