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é !
%macro show_table_in_log(table) ;
%let dsid=%sysfunc(open(&table)) ;
%let nvars=%sysfunc(attrn(&dsid,nvars)) ;
proc sql noprint ;
select
%do i=1 %to &nvars ;
%let varname=%sysfunc(varname(&dsid,&i)) ;
%let vartype=%sysfunc(vartype(&dsid,&i)) ;
%let varformat=%sysfunc(varformat(&dsid,&i)) ;
%if &varformat= %then %let varformat=best32. ;
%if &vartype=C %then max(max(length(&varname),%length(&varname)))+1 as max_&varname ;
%else max(max(length(strip(put(&varname,&varformat))),%length(&varname)))+1 as max_&varname ;
%if &i<&nvars %then , ;
%end ;
into
%do i=1 %to &nvars ;
%let varname=%sysfunc(varname(&dsid,&i)) ;
:max_&varname
%if &i<&nvars %then , ;
%end ;
from &table;
quit ;
data _null_ ;
set &table end=_end ;
if _n_=1 then do ;
put / %eval(18+%length(&table))*'='
/ @'Start of Table: &table'
/ %eval(18+%length(&table))*'=';
put
%let pos=1 ;
%do i=1 %to &nvars ;
%let varname=%sysfunc(varname(&dsid,&i)) ;
%let max_varname=max_&varname ;
@&pos "&varname"
%let pos=%eval(&pos+&&&max_varname) ;
%end ;
;
put
%let pos=1 ;
%do i=1 %to &nvars ;
%let varname=%sysfunc(varname(&dsid,&i)) ;
%let max_varname=max_&varname ;
@&pos %eval(&&&max_varname-1)*'-'
%let pos=%eval(&pos+&&&max_varname) ;
%end ;
;
end ;
put
%let pos=1 ;
%do i=1 %to &nvars ;
%let varname=%sysfunc(varname(&dsid,&i)) ;
%let max_varname=max_&varname ;
@&pos &varname
%let pos=%eval(&pos+&&&max_varname) ;
%end ;
;
if _end then put %eval(16+%length(&table))*'='
/ @'End of Table: &table'
/ %eval(16+%length(&table))*'=' ;
run ;
%let dsid=%sysfunc(close(&dsid)) ;
%mend show_table_in_log ;
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 &TABLEEND=_end ;
26
IF _n_=1THENDO ;
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.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.