Publié le :
Macro MIXTE

Macro pour afficher une table SAS dans le journal

Cette macro, `show_table_in_log`, prend en entrée le nom d'une table SAS©. Elle calcule d'abord dynamiquement la largeur optimale pour chaque colonne en se basant sur la longueur des données et des noms de variables via une PROC SQL. Ensuite, une étape DATA _NULL_ parcourt la table pour imprimer dans le journal un en-tête, les lignes de données, et un pied de page, le tout proprement aligné. C'est un utilitaire pratique pour le débogage ou pour une visualisation rapide des données sans passer par la fenêtre de sortie.
Analyse des données

Type : MIXTE


La macro est générique et est conçue pour accepter en paramètre n'importe quelle table SAS. Les exemples fournis dans le code (`sashelp.class`, `sashelp.prdsale`) utilisent la librairie standard SASHELP, qui est toujours disponible. La source de données n'est donc pas fixée mais dépend de l'appel de la macro.

1 Bloc de code
Macro
Explication :
Ce bloc définit l'intégralité de la macro `%show_table_in_log`. Elle utilise des fonctions macro `%sysfunc` pour obtenir les métadonnées de la table (nombre de variables, noms, types). Une `PROC SQL` (avec l'option `noprint`) est exécutée pour calculer dynamiquement la largeur maximale nécessaire pour chaque colonne et stocker ces valeurs dans des variables macro. Enfin, une étape `DATA _NULL_` lit la table d'entrée ligne par ligne et utilise des instructions `PUT` pour écrire les en-têtes et les données formatées et alignées dans le journal SAS.
Copié !
1%macro show_table_in_log(TABLE) ;
2 %let dsid=%sysfunc(open(&TABLE)) ;
3 %let nvars=%sysfunc(attrn(&dsid,nvars)) ;
4 PROC SQL noprint ;
5 select
6 %DO i=1 %to &nvars ;
7 %let varname=%sysfunc(varname(&dsid,&i)) ;
8 %let vartype=%sysfunc(vartype(&dsid,&i)) ;
9 %let varformat=%sysfunc(varformat(&dsid,&i)) ;
10 %IF &varformat= %THEN %let varformat=best32. ;
11 %IF &vartype=C %THEN max(max(LENGTH(&varname),%LENGTH(&varname)))+1 as max_&varname ;
12 %ELSE max(max(LENGTH(strip(put(&varname,&varformat))),%LENGTH(&varname)))+1 as max_&varname ;
13 %IF &i<&nvars %THEN , ;
14 %END ;
15 into
16 %DO i=1 %to &nvars ;
17 %let varname=%sysfunc(varname(&dsid,&i)) ;
18 :max_&varname
19 %IF &i<&nvars %THEN , ;
20 %END ;
21 from &TABLE;
22 QUIT ;
23
24 DATA _null_ ;
25 SET &TABLE END=_end ;
26 IF _n_=1 THEN DO ;
27 put / %eval(18+%LENGTH(&TABLE))*'='
28 / @'Start of Table: &table'
29 / %eval(18+%LENGTH(&TABLE))*'=';
30 put
31 %let pos=1 ;
32 %DO i=1 %to &nvars ;
33 %let varname=%sysfunc(varname(&dsid,&i)) ;
34 %let max_varname=max_&varname ;
35 @&pos "&varname"
36 %let pos=%eval(&pos+&&&max_varname) ;
37 %END ;
38 ;
39 put
40 %let pos=1 ;
41 %DO i=1 %to &nvars ;
42 %let varname=%sysfunc(varname(&dsid,&i)) ;
43 %let max_varname=max_&varname ;
44 @&pos %eval(&&&max_varname-1)*'-'
45 %let pos=%eval(&pos+&&&max_varname) ;
46 %END ;
47 ;
48 END ;
49 put
50 %let pos=1 ;
51 %DO i=1 %to &nvars ;
52 %let varname=%sysfunc(varname(&dsid,&i)) ;
53 %let max_varname=max_&varname ;
54 @&pos &varname
55 %let pos=%eval(&pos+&&&max_varname) ;
56 %END ;
57 ;
58 IF _end THEN put %eval(16+%LENGTH(&TABLE))*'='
59 / @'End of Table: &table'
60 / %eval(16+%LENGTH(&TABLE))*'=' ;
61 RUN ;
62 %let dsid=%sysfunc(close(&dsid)) ;
63%mend show_table_in_log ;
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.