Publié le :
Reporting SASHELP

Création d'un Tagset ODS pour compter la fréquence des événements

Ce code est également disponible en : Deutsch English Español
Le script utilise `PROC TEMPLATE` pour créer un nouveau tagset. Ce tagset, 'counter', est conçu pour intercepter les événements ODS. Il utilise un dictionnaire interne pour stocker et incrémenter le compteur pour chaque nom d'événement rencontré. À la fin du document (événement `doc finish`), il trie les événements par ordre décroissant de fréquence et imprime un rapport textuel simple. Le script démontre ensuite l'utilisation de ce tagset en l'appliquant à la sortie de `PROC PRINT` sur la table `sashelp.class`, redirigeant le rapport de comptage vers un fichier 'counter.txt'.
Analyse des données

Type : SASHELP


Le script utilise la table `sashelp.class` comme exemple pour générer des événements ODS. Cette table n'est pas modifiée ; elle sert uniquement à déclencher l'exécution d'une procédure (`PROC PRINT`) dont les événements seront comptés par le tagset.

1 Bloc de code
PROC TEMPLATE
Explication :
Ce bloc utilise `PROC TEMPLATE` pour définir un nouveau 'tagset' ODS appelé `counter`. Les tagsets permettent de contrôler finement la sortie générée par SAS. Celui-ci est programmé pour compter les occurrences de chaque type d'événement ODS. Il utilise des dictionnaires (similaires à des tables de hachage) pour maintenir les comptes. Les événements clés sont `doc` (pour l'initialisation et la finalisation), `count` (pour incrémenter les compteurs), `sort` (pour trier les résultats) et `report` (pour afficher le rapport final).
Copié !
1/*
2 Tagset to count the frequency of each event and print a report.
3*/
4 
5PROC TEMPLATE;
6define tagset tagsets.counter;
7 default_event = 'count';
8 
9 /*
10 Create an event count dictionary `$events'. Each key in the
11 dictionary is an event name. The value is the number of times the
12 event occurred.
13 
14 At doc start, initialize the event dictionary and the total event
15 counter. At finish, sort the event names by decreasing occurrence
16 and print a report.
17 */
18 define event doc;
19 start:
20 eval $events[event_name] 1;
21 eval $total 0;
22 finish:
23 trigger sort;
24 trigger report;
25 END;
26 
27 define event count;
28 DO / IF $events[event_name];
29 eval $events[event_name] $events[event_name] + 1;
30 ELSE;
31 eval $events[event_name] 1;
32 done;
33 eval $total $total+1;
34 END;
35 
36 /*
37 Create an array `$evname' that contains the event names. Sort
38 `$evname' using the counts in `$events'.
39 */
40 define event sort;
41 trigger dup;
42 eval $size $events; /* $size = size of $events */
43 eval $i $size;
44 DO / while $i > 0;
45 eval $j 1;
46 DO / while $j < $i;
47 eval $jplus1 $j+1;
48 SET $evname_j $evname[$j];
49 SET $evname_jplus1 $evname[$jplus1];
50 DO / IF $events[$evname_j] < $events[$evname_jplus1];
51 SET $temp $evname[$j];
52 SET $evname[$j] $evname[$jplus1];
53 SET $evname[$jplus1] $temp;
54 done;
55 eval $j $j+1;
56 done;
57 eval $i $i-1;
58 done;
59 END;
60 
61 define event dup;
62 iterate $events;
63 DO / while _name_;
64 SET $evname[] _name_;
65 next $events;
66 done;
67 END;
68 
69 /*
70 Print the `$events' dictionary in the order specified by the
71 `$evname' array.
72 */
73 define event report;
74 put "Number of individual events: " $events nl;
75 put "Total number of events: " $total nl nl;
76 put "Count Event name" nl;
77 iterate $evname;
78 DO / while _value_;
79 eval $occur $events[_value_];
80 eval $occur putn($occur, 'F.', 5);
81 put $occur " " _value_ nl;
82 next $evname;
83 done;
84 END;
85 
86 END;
87 
88RUN;
2 Bloc de code
PROC PRINT
Explication :
Ce bloc applique le tagset `tagsets.counter` défini précédemment. La destination ODS `listing` est fermée, puis le tagset `counter` est activé pour écrire dans le fichier `counter.txt`. L'exécution de `PROC PRINT` sur `sashelp.class` génère des événements qui sont interceptés et comptés par le tagset. Finalement, le tagset est fermé et la destination `listing` est réactivée.
Copié !
1ods listing close;
2ods tagsets.counter file="counter.txt";
3PROC PRINT DATA=sashelp.class;
4RUN;
5ods tagsets.counter close;
6ods listing;
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.