VarLength
Hallo zusammen,
gibt es eine Macro-Lösung um die Länge einer Variable in einem Data Set zu ermitteln?
Eine Base-Lösung habe ich die aus der sashelp.vcolumn die Länge ausliest:
/*-----------------------------------------------------------------------
* Variablen-Länge auslesen
* Dieser Makro dient dem lesen der Länge der Variable,
* Aufruf-Beispiele:
* %varleng( positone, zzkon, KonzLae );
* %put KonzLae=&KonzLae.;
*----------------------------------------------------------------------- */
%put INFO: macro varleng(&dataset., &varname., &varlenp.);
%global &varlenp.;
%let _lib =%scan(&dataset.,1,.);
%let _dset=%scan(&dataset.,2,.);
%if &_dset. eq %then %do;
%let _dset=&_lib.;
%let _lib =work;
%end;
%*put INFO: _lib=&_lib. _dset=&_dset. varname=&varname.;
%let &varlenp.=;
data _null_;
set sashelp.vcolumn;
*put "INFO: " libname= memname= name= length=;
if upcase(libname) = "%upcase(&_lib.)"
and upcase(memname) = "%upcase(&_dset.)"
and upcase(name) = "%upcase(&varname.)"
then do;
put "INFO: length = " LENGTH;
call symput( "&varlenp.", compress(put( LENGTH, 8.)));
stop;
end;
run;
%put INFO: macro varleng, Ende: varlenp=&varlenp.=&&&varlenp..;
%mend varleng;
varleng-Macro zum Beispiel so:abc="abc123";
run;
%varleng( work.test, abc, abcLAE );
%put abcLAE=&abcLAE.;
Ich hätte jetzt gerne eine reine Macro-Lösung, die ohne den Base-Zugriff auf die sashelp.vcolumn auskommt.
Die Lösung sollte so ähnlich sein wie das auslesen von label, sortedby, ... aus den Tiefen des Data Dictionary.
Diese Dinge findet man in der SAS-Online-Doc » SAS Language Reference: Dictionary » Functions and Call-Routines: ATTRC » LABEL, ...
Das Label auslesen geht z.B. so:
/*----------------------------------------------------------------------
* Data Set Label auslesen
* Dieser Makro dient dem lesen von Labels,
* ist bei Kopieren von data Sets hilfreich
* wenn Kopie das gleiche Label haben soll wie Vorlage
* neue Version, statt Zugriff auf 'sashelp.vtable'
* jetzt 'sysfunc(attrc(&dsid.,LABEL))'
* Laufzeit, alt: 0:00:06
* Laufzeit, neu: 0:00:00
* Aufruf-Beispiele:
* %dslabel(work.positone , dslab );
* %put dslab=&dslab.;
*---------------------------------------------------------------------- */
%put INFO: macro dslabel(&dataset., &dslabp.);
%global &dslabp.;
%let _lib =%scan(&dataset.,1,.);
%let _dset=%scan(&dataset.,2,.);
%if &_dset. eq %then %do;
%let _dset=&_lib.;
%let _lib =work;
%end;
%*put INFO: _lib=&_lib. _dset=&_dset.;
%let &dslabp.=;
%global rc;
%let dsid = %sysfunc( open( &dataset. ) );
%if &dsid. %then %do;
%let &dslabp. =%sysfunc(attrc(&dsid.,LABEL));
%let rc =%sysfunc(close(&dsid.));
%put INFO: macro dslabel: &_dset. has label: &&&dslabp.;
%end;
%else %do;
%let text=sysmsg()=...%substr(%bquote(%sysfunc(sysmsg())), %length(%substr(###ERROR,4))+1); /* sysmsg-Text aber ohne das Wort Fehler am Anfang */
%put %substr(###NOTE,4): macro dslabel: Open for data set &dataset. failed - &text.;
%let rc =1;
%end;
%mend dslabel;
dslabel-Macro zum Beispiel so:%put dslab=&dslab.;
Gibt es mittlerweile (oder schon lange) eine Funktion (ähnlich wie die obige ATTRC- bzw. ATTRN-Funktion) um Attribute zu Variablen auszulesen ???
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
