News Artikel Foren Join Projekte List Links Random Über Redscope Previous Next Startseite › Foren › Allgemeine Fragen zu SAS In DATA step makro variable inkrementieren. 11 October, 2010 - 12:10 — Thiele Guten Tag! Das ist mein erster Beitrag im Forum. Habe schon länger mitgelesen und hilfreiche Sachen gefunden! Habe Problem bezgl des Data step, wahrscheinlich wurde schon mal ähnliches diskutiert, habe aber nichts gefunden. Als (sinnfreies) Beispiel hier mal: DATA alt; LENGTH PersonName $ 10 Surname $ 10; PersonName = "Bert"; Surname = "Sesam"; OUTPUT; PersonName = "Ernie"; Surname = "Sesam"; OUTPUT; PersonName = "Donald"; Surname = "Duck"; OUTPUT; RUN; DATA _NULL_; SET alt; CALL SYMPUT("name"||STRIP(_N_), PersonName); RUN; %LET i = 0; Data test; SET alt; %LET i = %EVAL(&i + 1); /* Hier ist mein Problem, diese Anweisung wird erst nach Ende des Datasteps ausgeführt, gibt es eine Möglichkeit wie man i SOFORT um eins inkrementieren kann?*/ IF STRIP(PersonName) ^= '' THEN DO; &&name&i = "Mr. or Mrs."||STRIP(Surname); END; RUN; Mit freundlichen Grüßen Thile Foren: Allgemeine Fragen zu SAS Log in or register to post comments Hallo, was ist der Ziel des 11 October, 2010 - 13:22 — SteffenM Hallo, was ist der Ziel des Programms, das Wunschergebnis? Grüße SteffenM Log in or register to post comments Macro-Code 11 October, 2010 - 14:04 — HansKneilmann Hallo Thile, egal was das eigentliche Ziel dieses Programms ist, bei der Programmierung mit SAS-Macro ist wichtig sich vorzustellen, dass man den vom Macro-Compiler erzeugten Code selbst geschrieben hätte. Denn genau das macht der Macro-Compiler im Prinzip. Es wird Base-Code erzeugt, der dann vom Base-Interpreter/-Compiler abgearbeitet wird. Der Wechsel zw. Base-Interpreter/-Compiler und Macro-Compiler (und wieder zurück) passiert zwischen jeden Proc- bzw. Data-Step. Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Log in or register to post comments Ziel wäre dieses Dataset 11 October, 2010 - 15:44 — Thiele PersonName Surname Bert Ernie Donald Bert Sesam Mr. or Mrs. Sesam Ernie Sesam Mr. or Mrs. Sesam Donald Duck Mr. or Mrs. Duck Log in or register to post comments Einfach noch mal den Kram... 11 October, 2010 - 14:20 — Frederik_Bloch Hallo Thile, wenn ich das richtig verstanden habe, willst du einfach ein Set von vorhandenen Macrovariablen anders füllen. Warum nicht einfach noch mal mit CALL SYMPUT überschreiben? DATA alt; LENGTH PersonName $ 10 Surname $ 10; PersonName = "Bert"; Surname = "Sesam"; OUTPUT; PersonName = "Ernie"; Surname = "Sesam"; OUTPUT; PersonName = "Donald"; Surname = "Duck"; OUTPUT; RUN; DATA _NULL_; SET alt; CALL SYMPUT("name"||STRIP(_N_), PersonName); RUN; Data _null_; SET alt; IF STRIP(PersonName) ^= '' THEN DO; call symput("name"||STRIP(_N_),"Mr. or Mrs."||STRIP(Surname)); END; RUN; Im letzten Datastep erzeuge ich jetzt keine SAS-Datei, wenn ja eh nur die Macrovariablen geändert werden sollen. Oder wolltest du jetzt eine SAS-Datei erzeugen, dir zusätzliche Variablen enthält? Gruß Frederik Log in or register to post comments Danke für die Antworten.Ja, 11 October, 2010 - 15:48 — Thiele Danke für die Antworten. Ja, das Ziel wären zusätzliche Variablen im Dataset: PersonName Surnam Bert Ernie Donald Bert Sesam Mr. or Mrs. Sesam Ernie Sesam Mr. or Mrs. Sesam Donald Duck Mr. or Mrs. Duck Ich will die Makrovariablen (name1 - name3) als Varaiblenname haben, aber ich kann sie nicht ansprechen weil ich nicht weiß wie ich i während des data step inkrementieren soll. Log in or register to post comments Lösung 11 October, 2010 - 16:06 — HansKneilmann Hallo, auf die schnelle eine Lösung, nicht sehr schön, aber sie klappt: DATA alt; LENGTH PersonName $ 10 Surname $ 10; PersonName = "Bert"; Surname = "Sesam"; OUTPUT; PersonName = "Ernie"; Surname = "Sesam"; OUTPUT; PersonName = "Donald"; Surname = "Duck"; OUTPUT; RUN; DATA _NULL_; SET alt; CALL SYMPUT("name"||STRIP(_N_), PersonName); RUN; %macro xxx; Data aaa; SET alt; %do ii=1 %to 3; if _N_ = &ii. then do; &&name&ii. = "Mr. or Mrs."||STRIP(Surname); end; %END; RUN; %mend xxx; %xxx; proc print; run; Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Log in or register to post comments Jawoll, das ist ja ne schöne 13 October, 2010 - 18:21 — Thiele Jawoll, das ist ja ne schöne Holzhammerlösung! Danke. Log in or register to post comments Lösung 2 11 October, 2010 - 16:09 — SteffenM Hallo, programmiertechnisch bin ich ein Fan der Trennung von Erzeugen von SAS-Codes mittels Makro und der eigentlichen Ausführung des SAS-Codes, weil ich eine Vermischung fast immer unübersichtlich finde. Wenn es nur um die Anlage der Variablen geht, würde ich wie folgt verfahren: DATA alt; LENGTH PersonName $ 10 Surname $ 10; PersonName = "Bert"; Surname = "Sesam"; OUTPUT; PersonName = "Ernie"; Surname = "Sesam"; OUTPUT; PersonName = "Donald"; Surname = "Duck"; OUTPUT; RUN; * Erzeugen des SAS-Codes für den Datastep (wird in die Makrovariable neue_Variablen_an proc sql; select cat("if PersonName = '",strip(PersonName),"' then ",PersonName," = 'Mr. or Mrs into :neue_Variablen_anlegen separated by " " from work.alt order by PersonName ; quit; * Ausführen des erzeugten Codes; data work.neu; set work.alt; &neue_Variablen_anlegen.; run; Grüße SteffenM Log in or register to post comments Führe mir den Code mal 13 October, 2010 - 19:07 — Thiele Führe mir den Code mal zugute, sieht elegant aus, danke auf jeden Fall! Log in or register to post comments