SAS-Makro-Definition zu VarListX

Werbung
News
Artikel
Foren
Join
Projekte
List
Links
Random
Über Redscope
Previous
Next
Startseite › Weblogs › HansKneilmann's blog
SAS-Makro-Definition zu VarListX
2 July, 2007 - 09:36 — HansKneilmann
Mittlerweile gibt es zwar einen besseren Platz für Macro-Definitionen, aber voher stand die MacroDefinition hier im Blog, deshalb kopiere ich die Macro-Definition für VarListX erneut hier hin.
Hier folgt nun die Kurz-Form von VarListX:
%macro VarListX( dset
, sep=%str( )
, pattern=
);
/*----------------------------------------------------------------------------* Macro:
VarListX
* Programmer: Pete Lund Hans Kneilmann
* Date:
Sept. 2000 Nov. 2006
* Purpose:
Create a macro variable that contains all the
*
variable names in a dataset, without those where pattern matches, separated by an
*
character(s) specified. Can be used in KEEPs, DROPs, SQL
*
SELECTs, etc.
*
* Parameters:
*
DSET - the name of the dataset (libref.member)
*
SEP - character(s) to separate the variable names
*
(default is a space)
*
pattern - pattern in variable name, skip variable if match found
*
(default is blanc, skip no variables)
*
*-----------------------------------------------------------------------------*/
%local ii dsid varlist;
%global rc;
%if &pattern. eq %then %let pattern=absoluter_blödsinn;
%let pattern=%upcase(&pattern.);
/* make sure that the dataset exists */
%if %sysfunc(exist(&dset.)) EQ 0
%then %do;
%put %substr(###WARNING,4): &DSET. does not exist;
%let rc=1;
/* 1 if 'Fehler' */
%let varlist=;
%goto Quit;
%end;
/*****
If it does exist, open the dataset. We'r going to create
a variable (varlist) which contains the list of variables
in the dataset, separated by the specified separator character(s). Start VarList off with the name of the first
variable in the dataset.
*****/
%let varlist=;
%let dsid =%sysfunc( open(&dset.) );
%let feld=%upcase(%sysfunc( varname( &dsid., 1 ) ));
%let feld=%upcase(%sysfunc( varname( &dsid., 1 ) ));
%if %index(&feld., &pattern.) GT 0 %then %do;
%put INFO: Überspringe Feld &feld.;
%end;
%else %do;
%let varlist=&varlist.&feld.;
%end;
/*****
Look through the rest of the variables in the dataset and
add them to the VarList value (with the sparator char in
between values).
*****/
%do ii=2 %to %sysfunc(attrn(&dsid., nvars));
%*et varlist=&varlist.&sep.%sysfunc( varname(&dsid., &ii.) );
%let feld=%upcase(%sysfunc( varname( &dsid., &ii. ) ));
%if %index(&feld., &pattern.) GT 0 %then %do;
/* 20070702: pattern statt _DM */
%put INFO: Überspringe Feld &feld. (pattern=&pattern.);
%end;
%else %do;
%if &varlist. NE %then %do; /* 20070702: NE statt EQ, dann stimmt if-then-else */
%let varlist=&varlist.&sep.&feld.;
%end;
%else %do;
%let varlist=&feld.; /* falls für ii=1 galt: überspringe Feld */
%end;
%end;
%end;
/*****
Close the dataset.
*****/
%let rc =%sysfunc( close(&dsid.) );
%Quit:
/*****
Write out the variable name list.
*****/
&varlist.
%mend VarListX;
Irgendwie habe ich es geschafft den Original-Blog-Eintrag zu löschen. Eigentlich wollte ich nur den
Fehler (siehe Beitrag Wolfgang Hornung, 29. Juni 2007, 13:20, siehe hier) korrigieren.
Anhang
Größe
Macro-Def-varlistX_pat2c.txt
HansKneilmann's blog
3.01 KB
Log in or register to post comments
Kommentare
_DM
Hallo Herr Kneilmann,
2 July, 2007 - 10:34 — Wolfgang Hornung
so geht es natürlich auch, anstelle der Vertauschung der LET-Anweisung.
Aber eine Frage hätte ich noch zu dem Coding:
Was bedeutet dieses _DM in der zweiten Indexfunktion?
Ich konnte es nirgends in der Online-Doc finden.
%if %index(&feld., _DM) GT 0 %then %do;
Gruß
Wolfgang Hornung
Log in or register to post comments
Lösung des _DM-Rätsels
2 July, 2007 - 10:51 — HansKneilmann
Hallo Herr Hornung,
das _DM ist einfach ein falscher Fehler. Glaube ich jedenfalls ...
Dieser VarListX ist (glaube ich) aus dem normalen VarList entstanden wegen einer Frage im
Redscope-Forum. Da wollte jemand eine Liste aller Variablen, ausser den Wert-Variablen (glaube
ich). Die Wert-Variablen endeten alle auf _DM.
Ich hatte den Macro dann zusammengebastelt und (scheinbar nur) leidlich getestet (siehe der
vertauschte then-/else-Zweig).
Als ich ihn dann umgebaut habe, um ihn als allgemeine Lösung ins Forum zu stellen, hatte ich
offenbar die von Ihnen genannte Stelle vergesessen zu ändern. Es muß heißen:
%if %index(&feld., &pattern.) GT 0 %then %do;
Die Macro-Funktion index will einfach einen String als 2. Parameter nach dem im String lt.
Parameter 1 gesucht wird.
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
Log in or register to post comments
Herunterladen