Das Skript verwendet `PROC TEMPLATE`, um ein neues Tagset zu erstellen. Dieses Tagset, 'counter', wurde entwickelt, um ODS-Ereignisse abzufangen. Es verwendet ein internes Wörterbuch, um den Zähler für jeden erkannten Ereignisnamen zu speichern und zu inkrementieren. Am Ende des Dokuments (Ereignis `doc finish`) sortiert es die Ereignisse nach absteigender Häufigkeit und druckt einen einfachen Textbericht. Das Skript demonstriert anschließend die Verwendung dieses Tagsets, indem es es auf die Ausgabe von `PROC PRINT` auf die Tabelle `sashelp.class` anwendet und den Zählbericht in eine Datei 'counter.txt' umleitet.
Datenanalyse
Type : SASHELP
Das Skript verwendet die Tabelle `sashelp.class` als Beispiel, um ODS-Ereignisse zu generieren. Diese Tabelle wird nicht geändert; sie dient lediglich dazu, die Ausführung einer Prozedur (`PROC PRINT`) auszulösen, deren Ereignisse vom Tagset gezählt werden.
1 Codeblock
PROC TEMPLATE
Erklärung : Dieser Block verwendet `PROC TEMPLATE`, um ein neues ODS-Tagset namens `counter` zu definieren. Tagsets ermöglichen eine feine Steuerung der von SAS generierten Ausgabe. Dieses ist darauf programmiert, die Vorkommen jedes ODS-Ereignistyps zu zählen. Es verwendet Wörterbücher (ähnlich Hash-Tabellen), um die Zählungen zu verwalten. Die Schlüsselereignisse sind `doc` (für Initialisierung und Finalisierung), `count` (zum Inkrementieren der Zähler), `sort` (zum Sortieren der Ergebnisse) und `report` (zum Anzeigen des Abschlussberichts).
Kopiert!
/*
Tagset to count the frequency of each event and print a report.
*/
proc template;
define tagset tagsets.counter;
default_event = 'count';
/*
Create an event count dictionary `$events'. Each key in the
dictionary is an event name. The value is the number of times the
event occurred.
At doc start, initialize the event dictionary and the total event
counter. At finish, sort the event names by decreasing occurrence
and print a report.
*/
define event doc;
start:
eval $events[event_name] 1;
eval $total 0;
finish:
trigger sort;
trigger report;
end;
define event count;
do / if $events[event_name];
eval $events[event_name] $events[event_name] + 1;
else;
eval $events[event_name] 1;
done;
eval $total $total+1;
end;
/*
Create an array `$evname' that contains the event names. Sort
`$evname' using the counts in `$events'.
*/
define event sort;
trigger dup;
eval $size $events; /* $size = size of $events */
eval $i $size;
do / while $i > 0;
eval $j 1;
do / while $j < $i;
eval $jplus1 $j+1;
set $evname_j $evname[$j];
set $evname_jplus1 $evname[$jplus1];
do / if $events[$evname_j] < $events[$evname_jplus1];
set $temp $evname[$j];
set $evname[$j] $evname[$jplus1];
set $evname[$jplus1] $temp;
done;
eval $j $j+1;
done;
eval $i $i-1;
done;
end;
define event dup;
iterate $events;
do / while _name_;
set $evname[] _name_;
next $events;
done;
end;
/*
Print the `$events' dictionary in the order specified by the
`$evname' array.
*/
define event report;
put "Number of individual events: " $events nl;
put "Total number of events: " $total nl nl;
put "Count Event name" nl;
iterate $evname;
do / while _value_;
eval $occur $events[_value_];
eval $occur putn($occur, 'F.', 5);
put $occur " " _value_ nl;
next $evname;
done;
end;
end;
run;
1
/*
2
Tagset to count the frequency of each event and print a report.
3
*/
4
5
PROC TEMPLATE;
6
define 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
88
RUN;
2 Codeblock
PROC PRINT
Erklärung : Dieser Block wendet das zuvor definierte Tagset `tagsets.counter` an. Das ODS-Ziel `listing` wird geschlossen, dann wird das Tagset `counter` aktiviert, um in die Datei `counter.txt` zu schreiben. Die Ausführung von `PROC PRINT` auf `sashelp.class` generiert Ereignisse, die vom Tagset abgefangen und gezählt werden. Schließlich wird das Tagset geschlossen und das Ziel `listing` reaktiviert.
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.