Anzahl der Variablen in einer Datei bestimmen
Verfasst von SAS-Fidi am 27 Juli, 2010 - 12:52
Wie bestimme ich die Anzahl der Variablen in einer Datei?
Proc Transpose machen und dann durchzählen oder gibt es eine elegantere Methode?
VG SAS-Fidi
»
- Anmelden oder Registrieren um Kommentare zu schreiben

RE. Anzahl der Variablen in einer Datei bestimmen
Hallo.
Alternativ auch mit einer Makrofunktion. Damit lässt sich der Ergebniswert besser weiter verarbeiten:
%local id;
%let id = %sysfunc(open(&tabelle.));
%let anz = %sysfunc(attrn(&id.,nvars));
%let id = %sysfunc(close(&id.));
&anz
%mend;
Und dann einfach als Funktion aufrufen. Etwa:
Viele Grüße
D. Dolic
ein kleine Makro hilft
Hallo,
ein kleines Makro tut es, wobei in der Makrovariable anz_var die Anzahl der Variablen steht.
Parameter
anz = Makrovariable, in der die Anzahl Variablen gespeichert werden soll
tabelle = Tabelle, in der die Varibalen gezählt werden sollen.
%macro anzahl(anz= , tabelle=);
%local id;
%let id = %sysfunc(open(&tabelle.));
%let &anz = %sysfunc(attrn(&id.,nvars));
%let id = %sysfunc(close(&id.));
%mend;
%anzahl(anz=anz_var, tabelle=sashelp.heart);
VG Guido Stosnach
Erst einmal vielen Dank!Hab
Erst einmal vielen Dank!
Hab allerdings aber immer noch Probleme damit.
So läuft es:
%macro anzahl(anz= , tabelle=);
%local id;
%let id = %sysfunc(open(&tabelle.));
%let anz = %sysfunc(attrn(&id.,nvars));
%let id = %sysfunc(close(&id.));
data gehtes;
n=&anz;
run;
%mend;
%anzahl(anz=anz_var, tabelle=basis);
Aber warum läuft es so nicht:
%macro alles(datei,varlist=,max=);
%let anz=;
%local id;
%let id = %sysfunc(open(&datei.));
%let anz = %sysfunc(attrn(&id.,nvars));
%let id = %sysfunc(close(&id.));
%do count=1 %to &anz;
%ebene(&datei,varlist1=&varlist,ebene=&count,maxziel=&max);
%end;
%mend;
%alles(baum,varlist=visuscale hba1c ydiab typdiab hypscale fette niere alter
nikotin bmiscale durchblut herzinf apoplex makula sysdruck diasdruck,max=2);
Der zweite Code erzeugt folgende Fehlermeldung:
361 %macro alles(datei,varlist=,max=);
362 %let anz=;
363 %local id;
364 %let id = %sysfunc(open(&datei.));
365 %let anz = %sysfunc(attrn(&id.,nvars));
366 %let id = %sysfunc(close(&id.));
367
368 %do count=1 %to &anz;
369 %ebene(&datei,varlist1=&varlist,ebene=&count,maxziel=&max);
370 %end;
371 %mend;
372
373 %alles(baum,varlist=visuscale hba1c ydiab typdiab hypscale fette niere
373! alter
MLOGIC(ALLES): Beginning execution.
374 nikotin bmiscale durchblut herzinf apoplex makula sysdruck
374! diasdruck,max=2);
MLOGIC(ALLES): Parameter DATEI has value baum
MLOGIC(ALLES): Parameter VARLIST has value visuscale hba1c ydiab typdiab
hypscale fette niere alter nikotin bmiscale durchblut
herzinf apoplex makula sysdruck diasdruck
MLOGIC(ALLES): Parameter MAX has value 2
MLOGIC(ALLES): %LET (variable name is ANZ)
MLOGIC(ALLES): %LOCAL ID
MLOGIC(ALLES): %LET (variable name is ID)
MLOGIC(ALLES): %LET (variable name is ANZ)
WARNING: Argument 1 to function ATTRN referenced by the %SYSFUNC or %QSYSFUNC
macro function is out of range.
NOTE: Mathematical operations could not be performed during %SYSFUNC function
execution. The result of the operations have been set to a missing value.
MLOGIC(ALLES): %LET (variable name is ID)
ERROR: A character operand was found in the %EVAL function or %IF condition
where a numeric operand is required. The condition was: &anz
ERROR: The %TO value of the %DO COUNT loop is invalid.
ERROR: The macro ALLES will stop executing.
MLOGIC(ALLES): Ending execution.
VG SAS-Fidi
Fehler-Suche und Lösungs-Ansatz
Hallo,
den Fehler vermute ich bei an der Stelle
%sysfunc(open(&datei.));. Ich würde direkt danach ein%put id=&id.;einfügen und dann schauen was im LOG steht ...Aber generell würde ich einen anderen Lösungs-Ansatz empfehlen:
Die Schleife läuft über alle Variablen des Data Set baum. Schön dynamisch codiert, prima bequem für den Benutzer.
Aber im Aufruf muß der arme Beutzer alle Variablen hintippen. Und wehe er vergisst eine, dann läuft die Schleife eins zu weit ... (oder habe ich da etwas falsch verstanden???)
Ich würde die Schleife statt über Anzahl der Variablen in einer Datei laufen zu lassen sie über die Anzahl der Worte im Parameter varlist1 laufen lassen. Dann passt die Anzahl Schleifen-Durchläufe immer zu den Angaben des Benutzers!
Die Anzahl Worte bestimmt man z.B. so:
string="&varlist1.";
nn = length(string)-length(compress(string)); /* liefert Anzahl Trennzeichen */
nn=nn+1; /* Korr., sonst ist Anz. 1 zu klein */
call symput("Anz", compress(put(nn,8.)));
run;
Eine andere Methode steht in der Redscope-Makro-Sammlung unter
org.redscope.HansKneilmann.*
Ich hoffe es hilft weiter
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
Das ist genau die Lösung, die
Das ist genau die Lösung, die mir gestern abend auch noch eingefallen ist. Danke, es funktioniert einwandfrei!
Das Eintippen der Variablen werde ich dem Benutzer allerdings nicht ersparen können. Ich nutze meist dieses kleine Macro um die Variablen einer Datei alle der Reihe nach in einen Output zu schreiben, dann muß ich nicht tippen sondern nur noch kopieren:
%macro shinhalt(datei);
%if &datei= %then %let datei=_last_;
proc contents data=&datei short;
run;
%mend;
VG SAS-Fidi
VarList-Makro
Hallo,
noch netter geht es mit dem VarList-Makro, ganz ohne Edit->Copy ...
Allerdings lässt sich der VarList-Makro mit dem Ein-Zeiler
%if &datei= %then %let datei=_last_;noch bequemer machen ....VarList-Makro: Siehe in der Redscope-Makro-Sammlung unter
org.redscope.HansKneilmann.*
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)