SAS/ODS – Makro zum Routing der SAS-Ausgabe in ein RTF- oder PDF-Dokument
Von Hans-Peter Altenburg: Hans-Peter Altenburg, Heinrich Stürzl, Almut Hahn, Carina Ortseifen, Grischa Pfister: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2008
Wir gehen der Einfachheit von folgender Verzeichnisstruktur aus: Neben einem Projekt-Hauptverzeichnis („MAINPROJEKT_XXX“) gibt es dort verschiedene Unterverzeichnisse, wie z.B. Data (für die Daten), P (für Programme), PDF (für PDF-Dokumente), RTF (für RTF-Dokumente), M (für SAS-Makros) usw.:
D:\....\MainProjekt_XXX \Data \M \P \PDF \RTF . . .
Zum Routing der Ausgabe benötigt man zwei SAS-Makros, welche etwa folgendermaßen aussehen können:
/* ---------------------------- ODS Start ------------- */ %MACRO StartODS(tout, stammpfad,Out_Dset) ; %LET outpfad=&stammpfad\&tout ; GOPTIONS ROTATE=Landscape ; OPTIONS ORIENTATION=Landscape PAPERSIZE="ISO A4" ; ODS LISTING CLOSE ; ODS &tout FILE="&outpfad\&Out_DSet..&tout" STARTPAGE=NO %IF %UPCASE(&tout)=PDF %THEN %STR(NOTOC ; ) ; %ELSE %STR( ; ) ; %MEND ; /* ---------------------------- ODS Start ------------- */ /* ---------------------------- ODS End --------------- */ %MACRO EndODS(tout) ; ODS &tout CLOSE ; ODS LISTING ; %LET tout= ; %MEND ; /* ---------------------------- ODS End --------------- */
Die Makrovariable "tout" bezeichnet den Dokument-Typ, also etwa RTF oder PDF. Die Makrovariable "stammpfad" bezeichnet den Projektpfad (z.B. MAINPROJEKT_XXX). Im angegebenen "stammpfad" muss ein Unterverzeichnis mit dem Namen RTF oder PDF existieren. Ein solches Verzeichnis könnte auch neu angelegt werden, dann muss das Makro entsprechend modifiziert werden. Die Makrovariable "Out_Dset" bezeichnet den Namen der Datei (ohne die Erweiterung RTF bzw. PDF!) in welche die SAS-Ausgabe geschrieben werden soll.
Während die Ausführung des Makros STARTODS(...) das Routing in eine entsprechende Datei startet, führt das Makro EndODS(...) die Ausgabe wieder zurück ins normale LISTING. Mehrere Start/End "Klammern" hintereinander mit unterschiedlichen Dateinamen erzeugen entsprechend verschiedene Ausgabe-Dateien in den Verzeichnissen (PDF oder RTF).
Falls die Pfade / Verzeichnisse zuerst mit Ausführung des StartODS-Makros im Projektverzeichnis "stammpfad" angelegt werden sollen, so kann ein entsprechender DATA-Step ins Makro eingebaut werden, z.B.:
... DATA _NULL_ ; * Anlegen der Projektunterverzeichnisse im Verzeichnis stammpfad ; ReturnCode=DCREATE("PDF","&stammpfad") ; PUT /// 'PFad für das Projektunterverzeichnis angelegt: ' Returncode /// ; ReturnCode=DCREATE("RTF","&stammpfad") ; PUT /// 'PFad für das Projektunterverzeichnis angelegt: ' Returncode /// ; RUN ; ...
Siehe hierzu auch Tipps und Tricks vom letzten Jahr!
Die Ausgabe erfolgt im Beispiel im Quer-Format, wegen der langen SAS Outputs und damit Grafiken besser zu interpretieren sind.
Beispiel:
%LET stammpfad=D:\... MAINPROJEKT_XXX ; %LET PDF_DSet =Bsp_NVData ; %INCLUDE "&stammpfad\M\StartEndODS.sas" ; * Einlesen der Macros ; TITLE1 H=2 C=BLUE 'Standard-Normal verteilte Zufallsvariablen' ; /* Erzeugen einer Test Datei */ DATA Bsp1 ; DO Gruppe=1 TO 3 ; DO IDVar=1 TO 20 BY 1 ; xx=NORMAL(0) ; OUTPUT ; END ; END ; RUN ;
/* ---------------------------- ODS Start ---------------------- */ %LET DocType=PDF ; * zB PDF RTF ; %StartODS(&DocType,&stammpfad,&PDF_DSet) /* ---------------------------- ODS Start ---------------------- */ PROC PRINT DATA=Bsp1 ; BY Gruppe ; ID IDVar ; RUN ; ODS &Doctype STARTPAGE=NOW ; * neue Seite im Output ; PROC MEANS DATA=Bsp1 N Mean STD VAR ; BY Gruppe ; VAR xx ; RUN ; /* ---------------------------- ODS End ------------------------ */ %EndODS(&DocType) /* ---------------------------- ODS End ------------------------ */
Individuelle Änderungen und Erweiterungen sind natürlich jederzeit möglich. Das Beispiel lässt sich auch noch etwas modifizieren und die Ausgabe in zwei verschiedene Dateien mit Namen „LISTING“ bzw. „MeanStd“:
%LET DocType=PDF ; * zB PDF RTF ; /* - ODS Start - */ %StartODS(&DocType,&stammpfad,Listing) /* ---------------------------- ODS Start ------------------ */ PROC PRINT DATA=Bsp1 ; BY Gruppe ; ID IDVar ; RUN ; /* - ODS End --- */ %EndODS(&DocType) /* -- ODS End -------- */ /* - ODS Start - */ %StartODS(&DocType,&stammpfad,MeanStd) /* ---------------------------- ODS Start ------------------ */ PROC MEANS DATA=Bsp1 N Mean STD VAR ; BY Gruppe ; VAR xx ; RUN ; /* - ODS End --- */ %EndODS(&DocType) /* -- ODS End ------- */