SAS/ODS – Makro zum Routing der SAS-Ausgabe in ein RTF- oder PDF-Dokument
Aus SAS-Wiki
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 ------- */

