Wohin mit den Pfadangaben? – Verwendung eines Vorlaufprogramms

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Heribert Ramroth aus: Carina Ortseifen, Grischa Pfister, Heribert Ramroth, Marianne Weires: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2009

Pfadangaben in SAS Programmen - Ausgangssituation

Stellen Sie sich vor,

  • Sie arbeiten sowohl auf dem Institutsserver als auch unterwegs auf einem Laptop
  • Ihr Datenbankmanager ändert mal wieder die Ordnerstruktur auf dem Server
  • Sie erhalten Programme & Daten, die auf Ihrem Rechner erneut ablaufen sollen

Bei Änderungen in den Ordnerstrukturen sind in allen SAS Programmen mit Pfadangaben Änderungen erforderlich. Dies ist

  • zeitaufwendig
  • ärgerlich
  • vermeidbar

Im Folgenden wird eine einfache Möglichkeit gezeigt, dies zu vermeiden:

  • Sie nehmen alle Pfadangaben aus den Programmen heraus und definieren Libnames und Filenames in einem Vorlaufprogramm, z.B.
    • Autoexec.sas
    • BasicProjectSettings.sas
  • Noch besser: Sie übergeben den Pfad an eine Makro-Variable

Vorteil:

  • Bei Änderungen muss nur dieses aktualisierbare Vorlaufprogramm verändert werden. Im einfachsten Fall nur die Makro-Variable.

Die Definition von Libnames und Filenames in einem Vorlaufprogramm erhöht in jedem Fall die Übersicht. Im Falle der Verwendung einer globalen Makrovariablen, auf die auch später beliebig in den Programmen zurückgegriffen werden kann, können Libnames und Filenames ohne explizite Pfadnennung auch später definiert werden.

Beispiel einer Ordnerstruktur

Default Directory (main path) C:\MyFolder\MyProject\ Sub directories, e.g. C:\MyFolder\MyProject\OriginalData C:\MyFolder\MyProject\MyData C:\MyFolder\MyProject\Programs C:\MyFolder\MyProject\Results C:\Irgendwo\MyMacros

Eine Vorlaufdatei, die grundlegende Optionen für die gerade eröffnete SAS Sitzung festlegt, könnte wie folgt aussehen. Manchen Anwendern ist solch eine Datei möglicherweise unter dem Namen „Autoexec.sas“ bekannt. Ich möchte die Datei aufgrund der Zielsetzung hier jedoch einfacher „BasicProjectSettings.sas“ nennen.

options pagesize=54 pageno=1 nocenter ;
libname a "C:\Myfolder\MyProject\OriginalData";
libname b "C:\Myfolder\MyProject\MyData";
 
* Bereitstellung möglicherweise verwendeter SAS-Makros; 
%include "C:\Myfolder\MyProject\Programs\unistats.sas"; 
 
* RTF-Output (“Word”-Documents); 
filename rtfdummy "C:\MyFolder\MyProject\Results\Dummy.rtf";

Die Verwendung einer festen Ausgabedatei (hier Dummy.rtf) in einem festgelegten Pfad soll hier nochmals gesonderte Beachtung finden: Im Allgemeinen ist die RTF-Ausgabe einer Datei nicht endgültig und erfordert Ergänzungen oder verschönernde Nachbearbeitungen. Wird die Ausgabe in eine Aufgabenspezifische RTF-Datei geleitet, dann wird sie bei einem späteren – möglicherweise unbeabsichtigten – Programmdurchlauf überschrieben. Daher ist es – meines Erachtens – am geschicktesten, die RTF-Ausgabe immer in eine temporäre Dummy-Datei auszugeben, diese in einem manuellen Schritt zu kontrollieren, ergänzen und verschönern. Abschließend wird das überarbeitete Ergebnis dann in einer Ergebnisdatei gespeichert, die zu keinem Zeitpunkt Gefahr läuft programmtechnisch überschrieben zu werden.

Wie oben ersichtlich, gibt es offensichtlich bei einem wohlstrukturierten Projekt immer einige Wiederholungen von Teilen des Pfadnamens, d.h. Wiederholung von Text. Optimieren lässt sich die Verwendung von wiederholtem Text durch Einsatz einer oder mehrerer Makro Variablen.

* Definiere Makro-Variable “Root”; 
%LET Root=C:\Myfolder\MyProject ;

libname a "&Root.\OriginalData";
libname b "&Root.\MyData";

%include "&Root.\Programs\unistats.sas"; 

* RTF-Output (“Word”-Documents); 
filename rtfdummy "&Root.\Results\Dummy.rtf";

Der Hauptvorteil der Verwendung der Makro-Variablen Root ist offensichtlich: Einfache Anpassung an veränderte Datenstrukturen wird durch alleinige Änderung der Root-Variablen erreicht. Bei komplexeren Ordnerstrukturen können natürlich auch mehrere Makro-Variablen definiert werden. Besonders soll hier noch auf die Definition und Verwendung einer weiteren Makro-Variablen hingewiesen werden.

Das i-Tüpfelchen: &OdsRtfOpen.

Man betrachte die folgenden sinnvollen ODS Optionen:

ods rtf file=rtfdummy bodytitle startpage=no style=styles.journal;
startpage=no Lästige Seitenumbrüche werden vermieden. Insbesondere müssen diese nicht manuell später aus dem RTF-Dokument entfernen werden.
bodytitle Titel werden direkt vor das Prozedurergebnis und nicht in die Kopfzeile geschrieben.
style=styles.journal ein optisch netter Ausgabestil (Alternative: styles.minimal)

Diese ODS Optionen werden nun in die Makro-Variable OdsRtfOpen geschrieben:

%LET OdsRtfOpen = %STR(<ODS Aufruf plus Optionen>);

Aufruf später im Programm:

Statt:

ods rtf open <ODS OPTIONEN>;
relevante Ausgabe;
ods rtf close;

einfacher:

&OdsRtfOpen.;
relevante Ausgabe;
ods rtf close;


Zusammenfassung

options pagesize=54 pageno=1 nocenter ;
%let Root=C:\Myfolder\MyProject ;
libname a "&Root.\OriginalData";
libname b "&Root.\MyData";
%include "&Root\Programs\unistats.sas"; 
filename rtfdummy "&Root.\Results\Dummy.rtf"; *…csv… pdf… etc.;
%LET OdsRtfOpen =
     %STR(ods rtf file=rtfdummy bodytitle startpage=no 
          style=styles.journal);