Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
New Contributor
Beiträge: 2
SAS-Tipp #7: Nützliches aus der SCL Mottenkiste

Hallo SAS-Coder,

mit dem SAS-Tipp #7 soll die Tipp-Reihe aus Redscope.org fortgesetzt werden. Die Tipps #1 bis #6 befinden sich im Redscope-Archiv.

Los geht's mit einem Tipp aus der SCL Mottenkiste ;-)

SCL ist eine SAS-Programmiersprache aus grauer Vorzeit zur Steuerung von interaktiven Bildschirm-Oberflächen (SAS/FSP und SAS/AF Software), was seit Jahren von JAVA übernommen wird. Trotzdem haben einige Funktionen aus dem SCL-Sprachumfang Eingang in die Base SAS-Programmierung gefunden. Hilfreich können die Auslesefunktionen für Dataset Header ATTRN und evtl. ATTRC sein. ATTRN liest numerische Informationen aus, wie ‚Anzahl Observations‘ oder ‚Anzahl der Spalten (Variablen)‘. ATTRC liest alphanumerische Informationen aus (SAS Documentation zu SAS/AF). Zum Auslesen eines Datasets muss dieses zuvor mit der Funktion OPEN identifiziert und abschließend mit der Funktion CLOSE wieder freigegeben werden (Beispiel 1).

Beispiel 1:

DATA work.sample;

  set lib.ds_name;

   If _n_ = 1 then do;

    ds_id = open(‘lib.ds_name‘);

    n = attrn(ds_id,‘NOBS‘);        * Anzahl Observations;

        ds_id = close(ds_id);

        If n = 0 then stop;

end;   

Besonders elegant können diese SCL-Funktionen in einem selbstauflösenden Inline-Macro genutzt werden (Beispiel 2).

Beispiel 2:

%macro SCLNLOBS(dataset);

%local dsid nlobs dataset;

  %if %str(&dataset.)= %str( ) %then%do;

    %let dataset = &syslast.;

  %end;

  %let dsid  = %sysfunc(open (&dataset.));

  %let nlobs = %sysfunc(attrn(&dsid.,NLOBS));

  %let dsid  = %sysfunc(close(&dsid.));

  &nlobs.

%mend;

Die Anwendung gelingt innerhalb von Datastep- sowie Macrocode (Beispiel 3):

Beispiel 3:

data test;

a=1; output; output;output;

run;

%macro loop;

%do i = 1 %to %sclnlobs(test);

data test&i;

  do i = 1 to %sclnlobs(test);

   b=1; output;

  end;

run;

%end;

%mend;

%loop;

Weitere nützliche SCL-Funktionen sind VARTYP und VARNAME. So lässt sich mit folgendem Code eine Macrovariable &varlist erzeugen, die alle numerischen Variablen eines Datasets enthält:

%let dsid=%sysfunc(open(mydata,i));

%let varlist=;

%do i=1 %to%sysfunc(attrn(&dsid,nvars));

  %if (%sysfunc(vartype(&dsid,&i)) = N) %then

     %let varlist=&varlist %sysfunc(varname(&dsid,&i));

%end;

%let rc=%sysfunc(close(&dsid));

Vielen Dank an Christoph Winter und Harry Piel für die Unterstützung bei diesem Tipp.