Makro-Funktionen

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Einleitung

Makro-Funktionen verarbeiten Makroausdrücke, sogenannte Argumente, wie z.B. Variablen oder Zahlenketten, und erzeugen daraus ein Resultat, z.B. einen Buchstaben oder eine Zahl. Sowohl die Arguemente als auch die Ergebnisse sind immer Zeichenketten, unabhängig von ihrem Inhalt. Makro-Funktionen sind sowohl lokal als auch global zu verwenden.

Beispiel:
%Put %Eval(200+400);

In diesem Beispiel wird mit Hilfe der %Eval-Funktion die Summe der beiden Argumente 200 und 400 berechnet.

Mit Hilfe der %Put-Anweisung wird das Resultat 600 ausgegeben.

Die Makro-Funktionen lassen sich in fünf Kategorien einteilen:

  1. Bearbeitung von Zeichenketten
  2. Auswertung von logischen und numerischen Ausdrücken
  3. Behandlung von speziellen Zeichen
  4. Interaktion mit Dateivariablen (siehe Makro-Sprache und Datenschritt)
  5. Weitere Funktionen

Funktionen zur Bearbeitung von Zeichenketten

 %Index Findet das erste Auftreten einer Zeichenkette
 %Length Bestimmt die Länge des Arguments
 %Scan Sucht nach Worten
 %Substr Erzeugt einen Substring
 %Upcase Verwandelt Klein- in Großbuchstaben
 %Qscan, %Qsubstr %Qupcase analog zu oben, führen aber zusätzliche Quotierungen durch

%Index-Funktion

Die Funktion sieht nach, ob ein Argument in einer Zeichenkette (Quelle) vorhanden ist, und gibt die Position, an der sich das Argument zum ersten Mal in der Zeichenkette befindet, zurück. Ist das Argument nicht in der Quelle enthalten, wird eine 0 zurückgegeben.

Syntax:
%Index(Quelle, Argument)

Die Quelle und das Argument können

  • konstanter Text,
  • referenzierte Makro-Variable
  • andere Makro-Funktion und
  • Makro-Aufruf

sein.

Beispiel:
%Let a=ein sehr langer Wert;
%Let b=%Index(&a,n);
%Put n erscheint an Position &b;
Ergebnis: n erscheint an Position 3

Im Beispiel wird die %index-Funktion dazu benutzt, zu bestimmen, ob ein Datensatz (dsn) permanent oder temporär ist. Es wird überprüft, ob das Argument &dsn einen Punkt enthält. Enthält das Argument keinen Punkt, so ist die If-Bedingung erfüllt, und der Datensatz wird als temporär erkannt.

Beispiel:
%Macro check(dsn);
  %Global name;
  %If %Index(&dsn,.)=0 
  %Then %Put Der Name des temporären Datensatz ist work.&dsn;
  %Else %Put Der Name des permanenten Datensatz ist &dsn;
%Mend check;
Aufruf:  %check(report)
Ergebnis: Der Name des temporären Datensatz ist work.report.
Aufruf:  %check(daten.report)
Ergebnis: Der Name des permanenten Datensatz ist daten.report.

%Length-Funktion

Diese Funktion ermittelt die Länge eines Arguments. Wenn das Argument einen Nullwert hat, gibt die Funktion 0 zurück.

Syntax:
%Length(Argument)

Das Argument kann

  • konstanter Text,
  • referenzierte Makro-Variable
  • andere Makro-Funktion und
  • Makro-Aufruf

sein.

Beispiel:
%Let a=Guten;
%Let b=Tag;
%Put *%Length(&a)* **%Length(&b)** ***%Length(&a&b)***;
Ergebnis:
*5* **3** ***8***

%Scan- und %Qscan-Funktion

Die Funktion %Scan gibt das n-te Wort des Argument zurück, wobei Worte Zeichenketten in Argument sind, die durch Trennzeichen (delimiters) getrennt sind.

Syntax:
%Scan(Argument,n<,delimiters)

Gibt es weniger als n Worte, wird ein Nullstring zurückgegeben.
Folgende Trennzeichen sind Default-Delimiter: Leerzeichen(Blank), < ( + | & ! $ * ) ; - / , %.
Diese Delimiter müssen deshalb nicht angegeben werden. Wenn allerdings mehrere Delimiter im String enthalten sind und nur einer als Delimiter interpretiert werden soll, muss ein Delimiter-String angegeben werden.
Das Argument kann

  • konstanter Text,
  • referenzierte Makro-Variable
  • andere Makro-Funktion und
  • Makro-Aufruf

sein.

n kann eine Zahl oder ein Makro-Ausdruck sein.

Beispiel:
%Let string = /sas/9.3 /sas/9.2 /config/Lev1;
%Put 1. %scan(&string, 1);
%Put 2. %scan(&string, 2);
%Put 3. %scan(&string, 3);
Ergebnis:
1. sas
2. 9
3. 3
Beispiel:
%Put 1. %scan(&string,1, %Str( ));
%Put 2. %scan(&string,2, %Str( ));
%Put 3. %scan(&string,3, %Str( ));
Ergebnis:
1. /sas/9.3
2. /sas/9.2
3. /config/Lev1

Die Funktion %qscan ist identisch mit der %scan-Funktion, mit dem Unterschied, dass sie ein quotiertes Resultat liefert. Das bedeutet, bestimmte Zeichen, die in der Makro-Sprache eine besondere Bedeutung haben, werden für den Makro-Prozessor so maskiert werden, dass er sie nicht verarbeitet.

Syntax:
%Qscan(Argument,n<,delimiters)
Beispiel:
%Let x=%Nrstr(%a*%b*%c); 
%Put %Qscan(&x,3,*) ;
Ergebnis:
%c
Beispiel:
%Put %Scan(&x,3,*) ;
Ergebnis:
WARNING: Apparent invocation of macro C not resolved.
%c
Hinweis:  %Nrstr-Funktion wird weiter unten beschrieben

%Substr- und %Qsubstr-Funktion

Die Aufgabe der %Substr-Funktion ist es, eine Zeichenkette Argument ab der Position position einzulesen und ein unquotiertes Resultat zurückzugeben.

Syntax:
%Substr (Argument, Position <,Länge>)

Argument, Position und Länge können

  • konstanter Text,
  • Makro-Variable,
  • andere Makro-Funktion und
  • Makro-Aufruf

sein, wobei sich Position und Länge zu einer Zahl auflösen müssen. Die Länge und Position können Ergebnisse von Makro-Ausdrücken sein. Wenn Länge nicht angegeben wird, dann wird bis zum Ende gelesen. Ist Länge größer als das Argument erscheint eine Warnung.

Beispiel:
%Let Text=Lebe wild und gefährlich;
%Let resultat=%substr(&text,6);
%Put Das Ergebnis ist: &resultat;
Ergebnis:
Das Ergebnis ist: wild und gefährlich
Beispiel:
%Let resultat=%Substr(&text,6,4);
%Put Das Ergebnis ist: &resultat;
Ergebnis:
Das Ergebnis ist: wild
Beispiel:
%Let p=15;
%Let l=10;
%Let resultat=%substr(&text,&p,&l);
%Put Das Ergebnis ist: &resultat;
Ergebnis:
Das Ergebnis ist: gefährlich
Beispiel:
%Let resultat=%Substr(&text,
%Length(&text)-13);
%Put Das Ergebnis ist: &resultat;
Ergebnis:
Das Ergebnis ist: und gefährlich

Die Funktion %Qsubstr ist identisch mit der %Substr-Funktion, mit dem Unterschied, dass sie ein quotiertes Resultat liefert. Das bedeutet, bestimmte Zeichen, die in der Makro-Sprache eine besondere Bedeutung haben, werden für den Makro-Prozessor so maskiert werden, dass er sie nicht verarbeitet.

Syntax:
%Substr (Argument, position <,länge>)
Beispiel:
%Let a=1;
%Let abc=5;
%Let def=%Nrstr(&abc);
%Put *&def* *%Qsubstr(&def,1,2)* *%Substr(&def,1,2)*;
Ergebnis:
*&abc* *&a* *1*

%Upcase- und %Qupcase-Funktion

Diese Funktion %upcase transformiert alle kleinen Buchstaben, die im Argument genannt sind, in Großbuchstaben. Die %Upcase-Funktion liefert ein unquotiertes Resultat. Nützlich ist die Funktion besonders bei Vergleichsoperationen, da der Makro-Prozessor nicht automatisch Kleinbuchstaben in Großbuchstaben verwandelt, wenn er Vergleiche ausführt. Dies kann dann zu Fehlermeldungen führen, da z.B. das Argument add nicht als ADD erkannt wird.

Syntax:
%Upcase (Argument)
Beispiel:
%Macro verglei;
  %Put Geben Sie ihr Geschlecht an (w für weiblich,m für männlich):;
  %Input sex; 1)
  %If &sex =W %Then %Put weiblich; 2)
  %Else %Put männlich;
%Mend verglei;
Aufruf:
%verglei
Eingabe: w
Ergebnis:
männlich

1) Die %Input-Anweisung kann nur im Programm-Editor verwendet werden, sie funktioniert nicht im Enhanced-Editor. 2) Wenn Sie für Geschlecht ein W eingeben, soll weiblich ausgegeben werden. In diesem Beispiel passiert dies allerdings nur, wenn sie ein großes W eingeben. Bei einem kleinen Buchstaben erscheint männlich.

Beispiel:
%Macro verglei;
  %Put Geben Sie ihr Geschlecht an (W für weiblich,M für männlich):;
  %Input sex;
  %If %Upcase(&sex) =W %Then %Put weiblich; 1)
  %Else %Put männlich;
%Mend verglei;
Aufruf:
%verglei
Eingabe: w
Ergebnis:
weiblich

1) Mit Hilfe der %Upcase-Funktion wird auch das kleine w als weiblich erkannt.

Die Funktion %Qupcase ist identisch mit der %Upcase-Funktion, mit dem Unterschied, dass sie ein quotiertes Resultat liefert. Das bedeutet, bestimmte Zeichen, die in der Makro-Sprache eine besondere Bedeutung haben, werden für den Makro-Prozessor so maskiert werden, dass er sie nicht verarbeitet.

Syntax:
%Qupcase (Argument)
Beispiel:
%Let x=%Nrstr(%Eval(5+23));
%Put *&x* *%Qupcase(&x) *%Upcase(&x)*;
Ergebnis:
*%Eval(5+23)* *%EVAL(5+23) *28*

%Eval-Funktion zur Auswertung von logischen und numerischen Ausdrücken

Zur Auswertung von logischen und numerischen Ausdrücken steht die %Eval-Funktion zur Verfügung. Da der Makro-Prozessor buchstabenbasiert arbeitet, werden Zahlen normalerweise als Buchstaben behandelt.

Beispiel:
%Let y=100+200;
%put &y.;
Ergebnis:
100+200
Beispiel:
%Let y=%Eval(100+200); 
%put &y.;
Ergebnis:
300

%Eval-Funktion

Die Funktion %Eval

  • wertet logische und numerische Ausdrücke aus
  • erlaubt nur ganzzahlige Arithmetik (keine nichtganzzahlige),
  • schneidet nichtganzzahlige Werte ohne Warnung ab (rundet somit immer ab),
  • erlaubt keine Verkettung (||,concatenation) und kein Minimum und Maximum (><, <>) und
  • gibt stets eine Zeichenkette als Ergebnis zurück.
Syntax:
%Eval(logischer oder numerischer Ausdruck)

Der logische oder numerische Ausdruck kann

  • konstanter Text,
  • referenzierte Makro-Variable,
  • andere Makro-Funktion und
  • Makro-Aufruf

sein.
Folgende Operationen sind möglich:

Operator Mnemonic Name Hierachie
** Potenzieren 1
+ positives Vorzeichen 2
- negatives Vorzeichen 2
Ø ^~ NOT logisches Nicht 1) 3
* Multiplikation 4
/ Division 4
+ Addition 5
- Subtraktion 5
<, > LT, GT kleiner als, größer als 6
<=, >= LE, GE kleiner gleich, größer gleich 6
Ø =, ^=, ~= NE ungleich 1) 6
& AND logisches Und 7
| OR logisches Oder 8

1) Die Symbole hierfür sind tastaturabhängig.

Mnemonic ist eine alternative Schreibweise.

Beispiel:
%Let wert=%Eval(50+60);
%Put Der wert ist:&wert;
Ergebnis:
Der wert ist:110
Beispiel:
%Let x=50;
%Let y=60;
%Let wert=%Eval(&x+&y);
%Put Der wert ist:&wert;
Ergebnis:
Der wert ist:110
Beispiel:
%Let wert=%Eval(&x+&y/11);
%Put Der wert ist:&wert;
Ergebnis:
Der wert ist:55

(sollte eigentlich 55,4545 sein, die %Eval-Funktion rundet aber immer ab)

Beispiel:
%Let wert=%Eval((&x+&y)/11);
%Put Der wert ist:&wert;
Ergebnis:
Der wert ist:10
Beispiel:
%Put %Eval(1.3 + 2.5);
Ergebnis:
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: 1.3 + 2.5

Die %Eval-Funktion wird immer dann implizit aufgerufen, wenn in der Makro-Sprache eine numerische oder logische Prüfung vorgenommen wird, also in allen %If-Statements oder bei %Do %While bzw. %Do %Until. Deswegen wird bei Fehlern dann auch eine entsprechende Fehlermeldung ausgegeben.

Beispiel:
%Macro Compare(first,second);
  %If ( &first > &second ) %Then %Put &first > &second;
  %Else %If ( &first = &second ) %Then %Put &first = &second;
  %Else %Put &first<&second;
%Mend;
Aufruf:
%Compare(1,2)
Ergebnis:
1<2
Aufruf:
%Compare(-1,0)
Ergebnis:
-1<0
Aufruf:
%Compare(-1.1,0.3);
Ergebnis:
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: ( &first > &second )
ERROR: The macro COMPARE will stop executing.

%Sysevalf-Funktion

Die Makro-Funktion %Sysevalf unterstützt "floating point" Berechnungen neben der Funktionalität der %EVAL-Makro-Funktion.

Beispiel: Verwendung %Sysevalf zur Typ-Konvertierung
%Macro figureit(a,b);
  %Let y=%Sysevalf(&a+&b);
  %Put The result with SYSEVALF is: &y;
  %Put The BOOLEAN value is: %SYSEVALF(&a +&b, boolean);
  %Put The CEIL value is: %SYSEVALF(&a +&b, ceil);
  %Put The FLOOR value is: %SYSEVALF(&a +&b, floor);
  %Put The INTEGER value is: %SYSEVALF(&a +&b, int);
%Mend figureit;
Aufruf:
%figureit(100,1.597)
Ergebnis:
The result with SYSEVALF is: 101.597
The BOOLEAN value is: 1
The CEIL value is: 102
The FLOOR value is: 101
The INTEGER value is: 101

Funktionen zur Bearbeitung von speziellen Zeichen (Textfunktionen)

Da bestimmte Textzeichen, wie z.B. Prozentzeichen, Semikolon oder Anführungszeichen für den Makro-Prozessor eine andere Bedeutung haben, bzw. der Makro-Prozessor anders darauf reagiert, als im normalen SAS-System, bedarf es spezieller Funktionen, der Quoting-Funktionen, um deren "normale" Bedeutung innerhalb des Makrosystems zu erzielen, und sie als Teil des Textes zu interpretieren.

Folgende Zeichen werden vom Makro-Prozessor nicht als Textzeichen interpretiert:

Zeichen Bedeutung
 ; Ende einer Anweisung
, Trennung von Argumenten einer Funktion/ eines Makros
&, % Referenz auf Makro- Variablen und -Aufruf
+,-,*,/, u.ä. werden als arithmetische und Vergleichsoperatoren erkannt
LT, NE, u.ä. werden als logische Operatoren erkannt
Leerzeichen nicht unterdrücken

Übersicht über die Textfunktionen:

Funktion Berücksichtigte Zeichen Beschreibung
 %Str = LT LE u.ä. quotiert konstanten Text zur Zeit der Kompilierung
 %Nrstr s.o., zusätzlich % und & s.o.
 %Quote = LT LE u.ä. quotiert konstanten Text zur Zeit der Makro-Ausführung
 %Bquote siehe %Quote, zusätzlich offene Anführungszeichen & Klammern (unmatched) s.o.
 %Nrquote siehe %quote, zusätzlich % und & s.o.
 %Nrbquote vereinigt die Funktionen von %Bquote und %Nrquote s.o.
 %Unquote löst Quotierungen wieder auf löst Quotierungen zur Zeit der Makro-Ausführung wieder auf
 %Superq & und % verhindert das Auflösen von Makroausdrücken bei der Auflösung von Makrovariablen.

Als Eselsbrücke kann man sich "nr" als "not resolved" und "b" als "by itself" merken.

%Quote-Funktion

Die %Quote-Funktion quotiert während der Makro-Ausführung konstanten Text. Die Funktion entfernt allerdings nicht die Bedeutung von Hochkommata, Klammern oder Makrohinweiszeichen, wie % und &.

Syntax:
%Quote(Argument)
Beispiel:
%Macro dept1(bdl);
  %If %Quote(&bdl)=bw %Then %Put Bundesland Baden Württemberg;
  %Else %Put Bundesland;
%Mend dept1;

%BQuote-Funktion

Die Funktion verarbeitet Argumente, die besondere Zeichen enthalten, welche der Makro-prozessor normalerweise nicht als Textzeichen interpretieren würde, z.B. offene Anführungs-zeichen und Klammern.

Syntax:
%Bquote(Argument)
Beispiel:
%Macro bq;
  %Global platz;
  %Put Geben Sie den Treffpunkt ein.;
  %Input;
  %Let platz=%Bquote(&Sysbuffr);
  %Put &platz;
%Mend bq;
Aufruf:
 %bq
Eingabe: Rick's Café

Der Makro-Prozessor würde ohne die %Bquote-Funktion die Fehlermeldung ERROR: Literal contains unmatched quote.melden. Mit der %Bquote-Funktion wird das Anführungszeichen als Teil des Texts erkannt und korrekt verarbeitet.

%Nrquote-Funktion

Diese Funktion ist analog zur %Nrbquote-Funktion (siehe unten), kann allerdings keine Klammern und Anführungszeichen verarbeiten.

%Nrbquote-Funktion

Mit Hilfe dieser Funktion können Ampersands und Prozentzeichen, sowie Anführungszeichen und Klammern als Teile von Argumenten erkannt und verarbeitet werden.

Syntax:
%Nrbquote(Argument)
Beispiel:
%Macro Nrbq;
  %Global platz;
  %Put Geben Sie den Treffpunkt ein.;
  %Input;
  %Let platz=%Nrbquote(&sysbuffr);
  %Put &platz;
%Mend nrbq;
Aufruf:
 %Nrbq
Eingabe: R&D in Rick's Cafe
Ergebnis:
WARNING: Apparent symbolic reference D not resolved. R&D in Rick's Cafe

Der Makro-Prozessor versucht zuerst, die vermeintliche Makrovariable &D aufzulösen. Diese Meldung taucht aber, dank der %Nrbquote-Funktion, nur ein einziges Mal auf. Überprüfen Sie es mit: '%Put &Platz;'. Zur Vermeidung der Warnung müsste man "R%Str(&)D at Rick's Cafe" eingeben.

%Unquote-Funktion

Die %Unquote-Funktion löst die Quotierung wieder auf, d.h. Argumente erhalten ihre ursprüngliche Bedeutung zurück. Sonderzeichen werden wieder als solche erkannt.

Die %Unquote-Funktion kann in folgenden Situationen nötig sein:

  • Wenn ein quotiertes Argument zu einem späteren Zeitpunkt der Makroausführung mit seinem ursprünglichen Wert benötigt wird.
  • Wenn eine Quoting-Funktion die Bedeutung des Eingabe-Arguments verändert hat.
Syntax:
%Unquote(Argument)
Beispiel:
%Macro rechne(wert1,wert2,op=add);
  %If %Upcase(&op)=ADD %Then %Let op=%Str(+); 1)
  %Else %If %Upcase(&op)=DIFF %Then %Let op=%Str(-);
  %Else %If %Upcase(&op)=MAL %Then %Let op=%Str(*);
  %Else %Do;
    %Put Der Operator &op ist nicht erlaubt;
    %Goto ende;
  %End;
  %Put Ergebnis: &wert1 &op &wert2 =
  %Eval(&wert1 %Unquote(&op) &wert2); 2)
%ende:
%Mend rechne;
Aufruf:
%rechne(18, 25, op=ADD);
%rechne(18, 25, op=diff);
%rechne(18, 25, op=mal);

1) Wenn die Variable op den Wert ADD zugewiesen bekommt, wird sie in ein Pluszeichen (+) verwandelt. Durch die %Str-Funktion wird das Pluszeichen von seiner Funktion als arithmetisches Operator enthoben. Es wird jetzt vom Makro-Prozessor als "normales" Textzeichen behandelt. 2) Durch die %Unquote-Funktion wird dem Pluszeichen (+) seine ursprüngliche Bedeutung zurückgegeben, und es kann als arithmetischer Operator verwendet werden.

Ohne Rück-Quotierung durch die %Unquote-Funktion taucht folgende Fehlermeldung auf:

ERROR: A character operand was found in the %Eval function or %If condition where a numeric operand is required.

%Str-Funktion

Die %Str-Funktion quotiert konstanten Text zur Zeit der Kompilierung (Konstruktion). Der Zeitpunkt der Quotierung ist der grundlegende Unterschied zur %Quote-Funktion, die bei jeder Makro-Ausführung neu durchgeführt wird. Wenn es darum geht, einen Makro-Ausdruck aufzulösen, sollte die %Quote-Funktion benutzt werden.

Die %Str-Funktion entfernt nicht die Bedeutung von Ampersands, Prozentzeichen und nicht-geschlossenen Hochkommata. Um nicht geschlossene Hochkommata zu quotieren, muss ein Prozentzeichen vor das Zeichen gesetzt werden:

Beispiel:
%Let place=%Str(Clinton%'s America);

Die %str-Funktion sollte bei folgenden Gegebenheiten verwendet werden:

  • Wenn ein Semikolon statt als Makroausdruck als Textzeichen verwendet werden soll.
  • Um ein Leerzeichen (Blank) bedeutsam zu machen.
  • Um ein nicht geschlossenes Hochkomma oder eine offene Klammer, die mit einem Prozentzeichen versehen sind, zu benutzen.
Syntax:
%Str(Argument)
Beispiel:
%Let p=%Str(Proc Print; Run;);
%Put &p;
%Let time=%Str( now);

%Nrstr-Funktion

Die %nrstr-Funktion quotiert, zusätzlich zu den Funktionen der %str-Funktion, auch Prozentzeichen und Hochkommata.

Beispiel:
%Let p=%Nrstr(%rechne);
%Put &p;

%Superq-Funktion

Diese Funktion verhindert die Auflösung von Makro-Ausdrücken bei der Auflösung von Makrovariablen. Die %Superq-Funktion ist in folgenden Fällen nützlich:

  • Bei Benutzung einer Makrovariablen, die mit einer %Input- oder %Window- Anweisung definiert wurde und ein Ampersand oder Prozentzeichen enthält.
  • Bei Benutzung einer Makrovariablen, die mit der SYMPUT-Routine geschaffen wurde und ein Ampersand oder Prozentzeichen enthält.
Syntax:
 %Superq(Makrovariable)
Beispiel:
%Input x;
%testvariable&anton;
%Put Der Inhalt der Variablen x ist: %Superq(x);
Ergebnis:
Der Inhalt der Variablen x ist: %testvariable&anton

Weitere Funktionen

%Sysfunc-Funktion

Mit Hilfe der Makro-Funktion %Sysfunc können SAS Funktionen oder vom Anwender geschriebene Funktionen (SAS/TOOLKIT oder FCMP) aufgerufen werden.

Folgende Funktionen können nicht von %Sysfunc bzw. %Qsysfunc aufgerufen werden:

ALLCOMB ALLPERM DIF DIM HBOUND
IORCMSG INPUT LAG LBOUND LEXCOMB
LEXCOMBI LEXPERK LEXPERM MISSING PUT
RESOLVE SYMGET

Aufgabenstellung:
Die Anzahl der Beobachtungen soll als Zahl allgemein verfügbar sein z.B. im Titel, im Datenschritt, für %IF-Abfragen, in %DO-Schleifen.

Lösung:
Mit Hilfe von %Sysfunc lassen sich über die SCL-Funktion "Attrn" aus dem Header der SAS Tabelle verschiedene Informationen auslesen, ohne die Datei selbst zu lesen, z.B.

  • Anzahl aller Beobachtungen ('NOBS') inkl. der zum Löschen markierten Beobachtungen
  • Anzahl der logischen Beobachtungen ('NLOBS') ohne die zum Löschen Markierten
  • Anzahl der Variablen ('NVARS')
Beispiel: Makrofunktion für die Rückgabe von NOBS
%Macro nobs (ds);
  %Local dsid rc;
  %If %Sysfunc(Exist(&ds)) %Then %Do;
    %Let dsid =%Sysfunc(Open(&ds));
    %Sysfunc(Attrn(&dsid, Nobs))
    %Let rc=%Sysfunc(Close(&dsid));
  %End;
  %Else -1;
%Mend nobs;

Eigenschaften:

  • Gibt die Anzahl aller Observations eines Data Set zurück (Ganzzahl = 0)
  • Als Text linksbündig formatiert
  • "-1", falls kein Zugriff auf Datei möglich
  • Makro ist sehr schnell und unabhängig von der Dateigröße
Anwendungsbeispiel:
Title "n=%nobs(work.xyz)";
Data new;
  n=%nobs(work.xyz)*2;
  Array x [%nobs(work.xyz)];
Run;
%Do i=1 %To %nobs(work.xyz);
  ...
%End;

%SYMEXIST-Funktion

Mit der Makro-Funktion %Symexist lässt sich feststellen, ob eine Makrovariable existiert.

Syntax:
%Symexist(macro-variable-name)
Beispiel:
%Global mvar1; 
%Macro testmvar;
  %Local mvar2;
  %if %symexist(mvar1) %then %put mvar1 existiert!;
  %else %put mvar1 existiert nicht!;
  %if %symexist(mvar2) %then %put mvar2 existiert!;
  %else %put mvar2 existiert nicht!;
  %if %symexist(mvar3) %then %put mvar3 existiert!;
  %else %put mvar3 existiert nicht!;
%Mend testmvar;
Aufruf:
%testmvar
Ergebnis:
mvar1 existiert!
mvar2 existiert!
mvar3 existiert nicht!

%SYMGLOBL-Funktion

Mit der Makro-Funktion %Symglobl lässt sich feststellen, ob eine globale Makrovariable existiert.

Syntax:
%Symglobl(macro-variable-name)
Beispiel:
%Global mvar1; 
%Macro testmvar;
  %Local mvar2;
  %if %symglobl(mvar1) %then %put mvar1 ist global!;
  %else %put mvar1 ist nicht global!;
  %if %symglobl(mvar2) %then %put mvar2 ist global!;
  %else %put mvar2 ist nicht global!;
  %if %symglobl(mvar3) %then %put mvar3 ist global!;
  %else %put mvar3 ist nicht global!;
%Mend testmvar;
Aufruf:
%testmvar
Ergebnis:
mvar1 ist global!
mvar2 ist nicht global!
mvar3 ist nicht global!

%SYMLOCAL-Funktion

Mit der Makro-Funktion %Symlocal lässt sich feststellen, ob eine lokale Makrovariable existiert.

Syntax:
%Symlocal(macro-variable-name)
Beispiel:
%Global mvar1; 
%Macro testmvar;
  %Local mvar2;
  %if %symlocal(mvar1) %then %put mvar1 ist lokal!;
  %else %put mvar1 ist nicht lokal!;
  %if %symlocal(mvar2) %then %put mvar2 ist lokal!;
  %else %put mvar2 ist nicht lokal!;
  %if %symlocal(mvar3) %then %put mvar3 ist lokal!;
  %else %put mvar3 ist nicht lokal!;
%Mend testmvar;
Aufruf:
%testmvar
Ergebnis:
mvar1 ist nicht lokal!
mvar2 ist lokal!
mvar3 ist nicht lokal!

%SYSMACEXEC-Funktion

Mit der Makro-Funktion %Sysmacexec lässt sich feststellen, ob ein Makro gerade ausgeführt wird oder nicht.

Syntax:
%Sysmacexec(macro-name)
Beispiel:
%Macro tuenichtviel;
  %if %SYSMACEXEC(tuenichtviel) %then %put tuenichtviel wird gerade ausgeführt!;
  %else %put tuenichtviel wird gerade nicht ausgeführt!;
  %if %SYSMACEXEC(gibtsnicht) %then %put gibtsnicht wird gerade ausgeführt!;
  %else %put gibtsnicht wird gerade nicht ausgeführt!;
%Mend tuenichtviel;
Aufruf:
%tuenichtviel
Ergebnis:
tuenichtviel wird gerade ausgeführt!
gibtsnicht wird gerade nicht ausgeführt!

%SYSMACEXIST-Funktion

Mit der Makro-Funktion %Sysmacexist lässt sich feststellen, ob ein Makro im Katalog WORK.SASMACR existiert oder nicht.

Syntax:
%Sysmacexist(macro-name)
Beispiel:
%Macro tuenichtviel;
  %if %SYSMACEXIST(tuenichtviel) %then %put tuenichtviel existiert!;
  %else %put tuenichtviel existiert nicht!;
  %if %SYSMACEXEC(gibtsnicht) %then %put gibtsnicht existiert!;
  %else %put gibtsnicht existiert nicht!;
%Mend tuenichtviel;
Aufruf:
%tuenichtviel
Ergebnis:
tuenichtviel existiert!
gibtsnicht existiert nicht!

%SYSMEXECDEPTH-Funktion

Die Makro-Funktion %Sysmexecdepth gibt die aktuelle Makro-Schachtelungstiefe zurück.

Syntax:
%Sysmexecdepth
Beispiel:
%Macro level1;
  %put macro level1 - %Sysmexecdepth;
  %level2;
%Mend level1;
%Macro level2;
  %put macro level2 - %Sysmexecdepth;
%Mend level2;
Aufruf:
%put open code - %Sysmexecdepth;
%level1;
Ergebnis:
open code -0
macro level1 -1
macro level2 -2

%SYSMEXECNAME-Funktion

Die Makro-Funktion %Sysmexecname gibt den Namen des Makros der spezifizierten Schachtelungstiefe zurück.

Syntax:
%Sysmexecname(n)
Beispiel:
%put %sysmexecname(%sysmexecdepth-1);
Ergebnis: Gibt den Namen des rufenden Makros zurück.

%SYSGET-Funktion

Die Makro-Funktion %Sysget gibt den aktuellen Wert der spezifizierten Umgebungsvariablen zurück.

Syntax:
%Sysget(umgebungs-variable-name)
Beispiel:
%Put %Sysget(USERNAME); 1)
%Put %Sysget(USER); 2)

1) unter Windows
2) unter UNIX

%SYSPROD-Funktion

Die %Sysprod-Funktion erinnert in ihrer Funktionalität an die automatischen Makrovariablen, siehe SAS-Makrovariablen. Sie überprüft, ob ein SAS-Modul in der installierten SAS-Version lizensiert ist oder nicht. Dies ist etwa dann interessant. wenn Sie mit einem Makro arbeiten wollen, dass das Modul SAS-IML verwendet, sie dieses Produkt aber nicht lizensiert haben.

Syntax:
%Sysprod(Argument)

Das Argument kann eine beliebige Zeichenkette sein. Sinnvoll sind aber nur die Namen von SAS-Modulen, wie z.B. ACCESS, AF, BASE, ETS,GRAPH, IML, QC,STAT.

Die %Sysprod-Funktion gibt nach der Überprüfung folgende Werte zurück:

  • 1 das Produkt ist lizensiert,
  • 0 das Produkt ist nicht lizensiert,
  • -1 das Argument ist kein SAS-Produkt
Beispiel Ergebnis
%Put %Sysprod(base);
1
%Put %Sysprod(QC);
0
%Put %Sysprod(Blödsinn);
-1
Beispiel:
%Macro plotte(sds,x,y);
  %If %Sysprod(graph)=1 %Then %Do; 1)
    Title "dies ist ein hochauflösender Plot";
    Proc Gplot Data=&sds;
      Plot &x*&y;
    Run;
    Quit;
  %End;
  %Else %Do;
    Title "SAS-Graph ist nicht lizensiert";
    Proc Plot Data=&sds;
      Plot &x*&y;
    Run;
    Quit;
  %End;
%Mend plotte;
Aufruf:
%plotte(sasuser.fitness, age, weight)

1) Wenn das Modul SAS-GRAPH lizensiert ist, gibt die %Sysprod-Funktion den Wert 1 zurück, und es wird die Prozedur Gplot ausgeführt. Ist das Modul nicht lizenziert, wird stattdessen die Prozedur Plot verwendet.

Siehe auch

Literatur

  • Ortseifen, C.(1993): Einführung in die SAS-Makro-Programmierung - Begleitskript zur Vorlesung Wintersemester 1993/1994 - nicht veröffentlicht.
  • SAS 9.3 Macro Language – Reference.