Datenschritt

Aus SAS-Wiki
(Weitergeleitet von DATA STEP)
Wechseln zu: Navigation, Suche

Der Datenschritt (DATA STEP) ist das zentrale und sehr mächtige Element der SAS-Sprache (englisch SAS Language), um Daten jeglicher Art zu lesen, in nahezu beliebiger Weise zu verarbeiten und in Form von SAS-Tabellen (data sets) zu speichern. Für die DATA-STEP-Programmierung steht eine sehr große Zahl von Anweisungen, Funktionen und Optionen zur Verfügung.

Die zu verarbeitenden Daten können sowohl aus anderen SAS-Tabellen als auch aus externen Dateien gelesen werden. Beispielsweise können ASCII-Dateien (*.txt, *.csv, *.xml, ...), Dateien mit proprietärem Dateiformat wie beispielsweise MS Excel, MS Access und SPSS sowie Datenbanken gelesen werden. Die Daten bestehender SAS-Tabellen lassen sich auf vielfältige Arten kombinieren.

Ein Datenschritt beginnt mit der DATA-Anweisung und sollte mit der RUN-Anweisung beendet werden, die wie jede Anweisung jeweils durch ein Semikolon abgeschlossen werden. Dazwischen können beliebig viele Datenschritt-Anweisungen stehen, jedoch keine weitere DATA- oder PROC-Anweisung (keine Schachtelung von Daten- und Prozedurschritten). Zur besseren Übersicht sollten die Anweisungen im Datenschritt eingerückt werden, zum Beispiel für jede weitere Verschachtelungstiefe um zwei Leerzeichen.

Syntax

DATA tabelle1 <tabelle2 ...> </ <DEBUG> <NESTING> <STACK=stack-size>>;
 ...
RUN;

tabelle1 steht für den zweiteiligen Namen der zu erstellenden SAS-Tabelle (data set) in der Form libref.data-set. Dabei bezeichnet libref die Bibliothek (library), in der die Tabelle gespeichert wird und data-set den Namen der Tabelle. Falls nur ein einteiliger Name angegeben wird, wird die Tabelle in der System Bibliothek WORK temporär bis zum Ende der SAS Sitzung gespeichert. Siehe SAS Bibliothekskonzept. Für jede Tabelle können nach dem Namen Tabellenoptionen (data set options) angegeben werden.

Sonderfall: DATA _NULL_; erzeugt keine SAS-Tabelle. Falls man weder einen Tabellennamen noch das Schlüsselwort _NULL_ angibt, wird ein automatischer Tabellenname DATA1, DATA2, ... vergeben.

Optionen der DATA-Anweisung werden nach einem '/' angegeben:

  • DEBUG startet den Datenschritt-Debugger, mit dessen Hilfe man interaktiv die Ausführungsphase des Datenschritts verfolgen kann.
  • NESTING erlaubt das Debugging von zusammengehörigen DO-END Blöcken und SELECT-END Blöcken durch eine entsprechende Darstellung im Log.
  • STACK=stack-size legt die maximale Tiefe von verlinkten (nested) LINK Blöcken fest.

Beispiele

DATA Beispiel1;
 x=1;
 Text="Hallo Welt";
RUN;

Erzeugt die temporäre Tabelle Beispiel1 in der Bibliothek WORK mit einer Beobachtung (observation) und einer numerischen Variable x und einer alphanumerischen (character) Variable Text.

DATA Beispiel2;
 DO x=1 TO 10;
  Text="Hallo Welt";
  OUTPUT;
 END;
RUN;

Erzeugt die temporäre Tabelle Beispiel2 in der Bibliothek WORK mit 10 Beobachtungen (observations) und einer numerischen Variable x mit den Werten von 1 bis 10 und einer alphanumerischen (character) Variable Text mit demselben Inhalt in jeder Datenzeile. Mit der iterativen DO Anweisung wird eine explizite DO-Schleife verwendet.

DATA kino;
 INFILE DATALINES;  * Datenquelle;
 INPUT Vorname $  Nachname:$12. GebDatum:DDMMYY10. Sex:$1.;

 Name=vorname||nachname;
 Alter=(TODAY() - gebdatum)/365.25; 

 DATALINES;
Benno        Fürmann          17.01.1971  1 
Dustin       Hoffmann         08.08.1937  1 
Franka       Potente          22.07.1974  2 
Gérard       Depardieu        27.12.1948  1 
Marlene      Dietrich         27.12.1901  2 
RUN;

Erzeugt die temporäre Tabelle kino in der Bibliothek WORK mit 5 Beobachtungen und 6 Variablen. Die zu verarbeitenden Datenzeilen stehen im Datenschritt nach der DATALINES-Anweisung und werden einzeln nacheinander gemäß der INPUT-Anweisung gelesen, wobei in diesem Beispiel vier Variablen (Vorname, Nachname, GebDatum und Sex) gebildet werden. Anschließend werden daraus durch zwei Zuweisungen (assignment) zwei weitere Variablen (Name und Alter) erzeugt. Anstelle der DATALINES-Anweisung könnte auch eine ASCII-Datei als Datenquelle dienen.

DATA SASUSER.klasse;
 SET SASHELP.class;
 Groesse=height*2.54/100; * Umrechnung inch in m;
 Gewicht=weight*0.45359237; * Umrechnung lbs in kg;
 BMI=gewicht/groesse**2; * Body Mass Index;
RUN;

Erzeugt die permanente Tabelle klasse in der System Bibliothek SASUSER. Nacheinander werden alle Beobachtungen (observations) aus der Tabelle class der Systembibliothek SASHELP gelesen und in der neuen Tabelle gespeichert, wobei zusätzlich zu den bestehenden drei neue Variablen durch je eine Zuweisungsanweisung (assignment) gebildet werden.

DATA jungs maedchen andere;
 SET sashelp.class;
 IF      sex="M" THEN OUTPUT jungs;
 ELSE IF sex="F" THEN OUTPUT maedchen;
 ELSE                 OUTPUT andere;
RUN;

Erzeugt drei temporäre Tabellen in der Bibliothek WORK. Nacheinander werden alle Beobachtungen aus der Tabelle class der Systembibliothek SASHELP gelesen und anhand der Ausprägungen der Variable sex auf die neuen Tabellen verteilt.

Grundlagen des Datenschritts

Bevor ein Datenschritt zur Ausführung kommt, wird er kompiliert. Dabei wird die Syntax überprüft und für alle benötigten Variablen wird im Arbeitspeicher der entsprechende Speicherplatz reserviert, wobei die Reihenfolge der Variablen und alle ihre Eigenschaften wie Name, Typ, Länge etc. festgelegt werden. Erst wenn der Datenschritt fehlerfrei kompiliert werden konnte, wird er ausgeführt, wobei die ausführbaren Anweisungen nacheinander auf jede Beobachtung angewendet werden (Implizite DO-Schleife).

Kompilierungsphase

Während der Kompilierung wird der Datenschritt von oben nach unten wortweise gescannt und auf korrekte Syntax überprüft und falls keine Fehler gefunden werden, automatisch kompiliert, das heißt in Maschinensprache übersetzt. Dabei wird erkannt, welche Variablen für diesen Datenschritt benötigt werden und ihre Reihenfolge gemäß ihrem Auftreten festgelegt. Alle Variablen werden hier definiert und deklariert, indem für jede Variable ihre Eigenschaften festgelegt werden:

  • Name: Der Variablenname muss der SAS Namenskonvention entsprechen. Ab Version 8 ist die Groß-/Kleinschreibung bei der Definition d. h. bei der ersten Nennung maßgeblich für die Speicherung.
  • Typ: SAS kennt nur zwei Variablentypen: numerisch oder alphanumerisch (character).
  • Länge (in Bytes): Numerische Variablen haben standardmäßig die Länge 8. Die Länge von Character Variablen kann von 1 bis 32k variieren.
  • Label: Ettikett aus maximal 256 Zeichen, wobei auch Sonderzeichen wie Blank und Umlaute zulässig sind.
  • Format: Ausgabeformat, das für Anzeige maßgeblich ist.
  • Informat: Einleseformat.
  • Flag, ob die Variable temporär ist. Temporäre Variablen sind nur zur Laufzeit des Datenschritt verfügbar und werden nicht in der erstellten Tabelle gespeichert. Siehe DROP-Anweisung.

In der Kompilierungsphase werden die sogenannten Deklarationsanweisungen (declarative statements) wirksam. Im Gegensatz zu den Ausführbaren Anweisungen (executable statements) wird eine Deklarationsanweisung nur einmal angewendet. Beispielsweise kann eine Variableneigenschaft wie der Variablentyp während des Datenschritts nicht mehr geändert werden. Deshalb spielt es keine Rolle an welcher Stelle im Datenschritt eine Deklarationsanweisung steht.

Wichtige Deklarationsanweisungen (declarative statements): LENGTH, KEEP, DROP, RENAME, FORMAT, INFORMAT, LABEL, ATTRIB, WHERE, BY, RETAIN, ARRAY


Für jede Variable wird im Arbeitsspeicher, im sogenannten Program Data Vector (PDV) entsprechender Speicherplatz reserviert. Dort wird während der Ausführungsphase nacheinander für jede Beobachtung der jeweilige Inhalt der Variable zwischengespeichert.

In jedem Datenschritt werden die temporären Variablen _N_ und _ERROR_ erzeugt, welche für die interne Verwaltung benötigt werden und nur während der Ausführungsphase zur Verfügung stehen.

  • _N_ ist der Zähler für die jeweilige Beobachtung.
  • _ERROR_ ist das Fehlerflag für die jeweilige Beobachtung und hat die Werte 0 (fehlerfrei) oder 1 (fehlerhaft).

Beispiel des PDV zum obigen Beispiel DATA kino Beispiel eines PDV

Ausführungsphase

Wenn ein Datenschritt fehlerfrei kompiliert wurde, kommt er zur Ausführung. Dabei werden die ausführbaren Anweisungen in der Reihenfolge ihrer Nennung im Datenschritt für jede einzelne Beobachtung ausgeführt. Während dieser sogenannten Impliziten DO-Schleife werden die folgenden vier Schritte solange wiederholt, wobei die Variable _N_ jeweils um eins erhöht wird, bis keine weitere Datenzeile mehr vorliegt:

  1. Initialisierung aller Variablen:
    Initial gilt _N_=1, danach wird jeweils um 1 erhöht. _ERROR_ wird auf 0 gesetzt.
    a) Neu entstehende Variablen, die durch die INPUT-Anweisung oder durch Zuweisung erzeugt werden, werden mit Missing Value initialisiert (Ausnahme RETAIN).
    b) Variablen, die aus einer SAS-Tabelle (mit SET, MERGE, MODIFY oder UPDATE) gelesen werden, behalten im PDV die Werte der vorangehenden Beobachtung („autoretain“).
    Ausnahme: Bei _N_=1 und beim Wechsel einer BY-Gruppe (siehe BY-Processing) wird ebenfalls mit Missing Value initialisiert.
  2. Nächste Datenzeile in den PDV einlesen mit der Anweisung SET, MERGE, MODIFY oder UPDATE aus einer SAS Tabelle oder mit der Anweisung INPUT aus einer externen (Nicht-SAS) Datei bzw. aus eingebetteten Datenzeilen (DATALINES)
  3. Ausführbare Anweisungen (executable statements) in der vorgegebenen Reihenfolge (!) im PDV ausführen
  4. Den aktuellen Inhalt des PDV als eine Beobachtung in die genannte(n) Tabelle(n) schreiben (OUTPUT)

Implizite-DO-Schleife im SAS Datenschritt als Flußdiagramm

Ausführbare Anweisungen (executable statements): ABORT, Zuweisung (Assignment), CALL, CONTINUE, DECLARE, DELETE, DESCRIBE, DISPLAY, DO, DO iterativ, DO UNTIL, DO WHILE, ERROR, EXECUTE, FILE, Subsetting IF, IF-THEN/ELSE, INFILE, INPUT, LEAVE, LINK, LIST, LOSTCARD, MERGE, MODIFY, _NEW_, Null, OUTPUT, PUT, PUTLOG, REDIRECT, REMOVE, REPLACE, RETURN, SELECT, SET, STOP, Sum Anweisung, UPDATE

Weblinks