Dynamisch Makros aufrufen

Ähnliche Dokumente
Umbenennung von Spaltennamen über Schleife(n)

zusammenfassen von Text variablenin einer Variable bei unterschiedlicher Variablenanzahl

QMF Tabelle Q.OBJECT_DATA in DB2

Ansprechen einer Anzahl von Variablen über einen Schleifendurchlauf

Hallo Jessi, wenn ich das. DATA aufg3_b; vari='<.0001'; IF &wil_two_test. le vari THEN pwert=0.0001;

Berechnung der Dauer eines SAS Makros?

Funktion: Tabelleninhalte nacheinander durch eine Funktion schicken

Jede Kombination von 7 Spalten erzeugen

SAS-Tipp #6: Schneller als Proc Summary

Spalten aufsummieren?!

Import von Text-Dateien. Einzelne Wörter einlesen.

Merge mit nicht eindeutigen by-variablen

Mehrere Datensätze zu einem Datensatz zusammenführen

Eine Variable in mehrere aufteilen

Änderung der Ordnung der Variablen in den SAS Datensatz

Ermittlung der übereinstimmenden Variablen (-Namen) zweier Datasets

Zeilen in SAS-Datensatz einfügen

Allman-Einrückungsstil versus 1TBS bei SAS-Base-Programmen

Alter berechnen mit Base SAS

Erzeugung von Zufallszahlen mit RANUNI()

viele ähnliche Datensätze automatisch einlesen

NICHT TRIVIAL: MAKROVARIABLEN - GLOBAL ODER LOKAL

Der SAS DataStep und die Prozedur SQL Cellent Finance Solutions GmbH Seite: 1

SUBSTRING - wo liegt mein Fehler?

ODS RTF Titel in Spalten linksbündig darstellen

Wie kann ich die Ausgabe als Excel speichern?

Formatierung beim Einlesen

Exportieren in excel sheets

Kreuztabelle als Data-Set so wie aus proc tabulate

Wie überprüfen, ob eine Datei existiert?

Auslesen von SAS Systeminformationen über die aktuelle Log- Ausgabe

rechtsbündige Leerzeichen mit einlesen im Datastep

Macro erzeugt Dateifilter

Zeit-Macro-Variablen, passend zu einem Tag

Berechnung der Arbeitstage

EG 4.2: Pfade zu verlinkten SAS-Files als relative Pfade speichern!?

Dateien trennen und zusammenfügen

Fehlermeldung, wenn Anzahl der %do der %end entspricht - was läuft falsch?

IMPORT / EXPORT Access

Makrofunktion zur Übernahme von Abfragekriterien aus externen Quellen, z.b. einer Excel Datei, in SAS Code (PROC SQL)

SAS BASE LOG Fragen. Antwort, Teil 1

Zugriff aus Oracle via Proc SQL: Performanceprobleme

Anhang zur Frage Data statement und Proc Statement

THEMA: SAS CERTIFIED BASE PROGRAMMER FOR SAS 9 DIE VORBEREITUNG BRINGT S! KARIN GROSS

Hilfe bei Programmierung mit SAS

Einlesen von Textdateien mit sehr langen Zeilen

SAS-Makro-Programmierung. Eine Einführung. Zusätzliche Übungsaufgaben

Excel Formularen mit SAS Daten

Langfassung des Beitrags für die 11. KSFE

SPDS-Problem - proc summary auf View mit by-variable - Sortierung wird verlangt

Tücken bei der Erstellung von Zufallszahlen mit RANUNI

Programminhalte extrahieren und modifizieren mit SAS. Katja Glaß

Performance von SAS Anwendungen optimieren!?

SAS Daten per Remote SUBMITE vom Großrechner selektieren,

News Artikel Foren Projekte Links Über Redscope

spezielle Summen bilden und proc corr

Bash-Skripting Linux-Kurs der Unix-AG

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

Dateneingabe und Transformation Übersicht

Import von XLS-Dateien aus einem Ordner in eine SAS-Datei

Erstellen von Dateilisten - Erfasssen von Dateiattributen

Perl Regular Expressions in Base SAS

THEMA: PLAUSIBILITÄTSPRÜFUNGEN MIT INTEGRITY CONSTRAINTS IN BASE SAS KARIN GROSS

SAS Format: Fallen und Tricks

Frage zu Markoschleife und PROC SQL

Zwei Tipps und Tricks: Fallstricke bei Makrovariablen und SAS im Batchmodus

SAS-Umgebung. Dr. Carina Ortseifen Universitätsrechenzentrum. 17. KSFE 2013 Ulm. 17. KSFE 2013 Ulm: Carina Ortseifen Der Datenschritt 1

THEMA: SAS STORED PROCESSES ALS WEB-/REST-SERVICE AUFRUFEN" BRUNO MÜLLER

Achsenbeschriftung um 90 drehen

Failed to transcode data from U_UTF8_CE to U_LATIN9_CE?!

Makros sind Code-Generatoren Ergebnis ist SAS/BASE Programm (bzw. ein Teil davon)

Effektives Arbeiten mit SAS

Excel sheet input / Zufallsgenerator/ Excel sheet output

Makro zum Auffinden mehrfach vergebener Schlüsselnummern

Abfragen (Queries, Subqueries)

Übung PL/SQL Trigger Lösungen

Einführung in die SAS Makro Sprache

Kapitel 9. Embedded SQL. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Datenbank und Tabelle mit SQL erstellen

Möglichkeiten der Nach-Verfolgung von Änderungen an SAS-Datensätzen

Übungsblatt 8- Lösungsvorschlag

Allgemeines. Shell Programmierung Unix. Kommentar. Vorgangsweise. Mag. Thomas Griesmayer

Praxis der Programmierung

Kapitel 4 Dynamisches SQL

Transkript:

News Artikel Foren Projekte Links Über Redscope Join List Random Previous Next Startseite Foren ETL & Base SAS Dynamisch Makros aufrufen 1 March, 2006-12:17 _ULeh Hallo, Meine Frage ist: Wie kann ich dynamisch SAS-Makros aufrufen, von denen ich erst zur Laufzeit des rufenden Programms/Makros mitbekomme, wo sich diese Makros befinden. Beispiel: Gegeben ist eine SAS-Dataset mit zwei Variablen (Pfad, Name) mit folgenden Einträge: /pfad/zu/dir/eins macro_eins /pfad/zu/dir/eins macro_zwei /pfad/zu/dir/zwei macro_eins Gesucht ist nun ein Makro, welches die in der Dataset definierten Makros der Reihe nach aufruft. Dabei soll nur die Kombination aus Name und Pfad eindeutig sein. Danke und Gruß _ULeh Foren: ETL & Base SAS Ein Programm erzeugen und dann ausführen 1 March, 2006-13:57 AndreasMangold /* Eine Beispieldatei erstellen */ DATA aufrufe; INPUT pfad $ 1-12 macro $ 14-23; DATALINES; c:/temp/eins macro_eins c:/temp/eins macro_zwei c:/temp/zwei macro_eins ; /* ein Fileref auf einen Katalogeintrag namens source vom Typ source im Catalog work.source erzeugen */ FILENAME source CATALOG "work.source.source.source"; /* die notwendigen SAS-Anweisungen schreiben lassen */ DATA _null_; SET aufrufe; FILE source; PUT "%INCLUDE '" pfad +(-1) "/" macro +(-1) ".sas';"; PUT "%" macro; RUN;

/* das erzeugte Programm ausführen */ %INCLUDE source; /* das Filref wieder freigeben */ FILENAME source; /* den Catalog wieder löschen */ PROC DATASETS NOLIST LIB=work; DELETE source (MEMTYPE=catalog); QUIT;... geht noch 'n bißchen einfacher Ich würde auf den temporären Katalog verzichten: 1 March, 2006-14:23 StephanFrenzel filename source temp; data _null_; file source; put '%put so gehts auch!;'; %inc source; filename source; Das "filename... temp" gibt's seit einiger Zeit auf allen Plattformen. Gruß Stephan Klasse 2 March, 2006-12:54 _ULeh Na hossa, mit so viel Ideen und Antworten habe ich gar nicht gerechnet. Dafür erstmal ein herzliches Danke. Eine kleine Unsicherheit habe ich noch: Wenn der Makrocode mittels %include eingebunden wird, wie lange ist dieser Makrocode dann gültig? Oder anders herum gefragt: Kann es sein, daß, wenn ich zwei gleichnamige Makros aus unterschiedlichen Verzeichnissen einbinde, SAS dann durcheinander kommt, und es nicht eindeutig ist, welches Makro genutzt wird? Oder noch einfacher: Wie kann ich Makrocode löschen? Mit freundlichen Grüßen _ULeh Makro wieder löschen 2 March, 2006-13:22 Daniel Hofmann SAS speichert das kompilierte Makro in einem SAS Katalog in work (und zwar "sasmacr"). Daraus kann man es zum Beispiel mit

proc catalog cat=work.sasmacr; delete macroname.macro; wieder löschen. Oder anders herum gefragt: Kann es sein, daß, wenn ich zwei gleichnamige Makros aus unterschiedlichen Verzeichnissen einbinde, SAS dann durcheinander kommt, und es nicht eindeutig ist, welches Makro genutzt wird? Es sollte das Makro vorhanden sein, welches als letztes mit include eingefügt wurde. Ich glaube nicht, dass SAS da durcheinander kommt, eher sehe ich die Gefahr, dass der Programmierer durcheinander kommt. Super 3 March, 2006-08:22 HansKneilmann Hallo, da werden sogar die Fragen der "Mitleser" automatisch beantwortet! Oben beim Beitrag von Andreas Mangold (vom 1 März, 2006-14:31, "Es fehlt noch die Fehlerbehandlung") fehlte mir der Hinweis, wie man die Makro-Definition wieder löscht. Tja, diese Frage ist nun auch beantwortet. Auch von mir: Danke! Gruß Hans Kneilmann, Schäfer Shop Fehlermeldung beim put 7 July, 2010-11:41 en-trust Ich wollte mittels Schleife aus meiner Tabelle, mit den variablen das var Statement zusammenbauen. Allerdings klappt das nicht, weil SAS wohl mit dem data _null_ in Verbindung mit dem put durcheinander kommt. Hat jemand eine Idee?

ERROR 180-322: Statement is not valid or it is used out of proper o filename source temp; data _null_; file source; put 'proc print data = WORK.xxx;' @; %let j = 1; %do %while (&j le &anz_column); data _null_; set WORK.VCOLUMN (obs = &j firstobs=&j); call symput ("name", name); %let name = %trim(%left(&name)); put 'var &name. ;' @; put 'sum &name. / style(data)=numeric_data;' @; %let j = %eval(&j + 1); %end; put ''; %inc source; filename source; das sieht mir eher so aus, 7 July, 2010-12:17 Muschik das sieht mir eher so aus, als ob es hier mit der Makroprogrammierung und dem Datastep zu durcheinander geht das erste DATA _NULL_ Statement wird durch das im Macro aufgerufene zweite Data _NULL_ statement beendet und put 'var &name. ;' @; steht ausserhalb eines Datasteps- deshalb der Fehler! Dieses Problem lässt sich besser wie folgt angehen: Data _NULL_; set WORK.Vcolumn end =ende; file source; if _N_= 1 then do; put 'proc print data = WORK.xxx;' @; put 'Var '; end; put Name; if ende then put ";"; Im Übrigen braucht man hier nicht zu "putten" sondern kann auch Call execute nutzen. Gruß MK

Variablenliste mit PROC SQL aus dem Dictionary Table holen Hallo en-trust, 7 July, 2010-12:27 AlexK wäre hier nicht ein neuer Thread angemessen gewesen? Was an Deinem Code sofort auffällt ist, dass er wegen des Makro-Loops außerhalb eines Makros nicht funktionieren kann. Davon abgesehen scheinst Du hier einen Data Step in einen anderen einbetten zu wollen. Das geht nicht. Ich würde mir die Variablenliste mit PROC SQL aus dictionary.columns holen und dann in einem normalen PROC PRINT verwursten: proc sql noprint; select Name into :VariableNames separated by ' ' from dictionary.columns where LibName = 'SASHELP' and MemName = 'CLASS' and Type = 'nu order by Varnum ; quit; proc print data = sashelp.class ; var &VariableNames. ; sum &VariableNames. / style(data)=numeric_data ; Hilft Dir das? Viele Grüße Alex Ich hätte das anders gemacht... 1 March, 2006-14:27 Daniel Hofmann Ich hätte das anders (aber sehr ähnlich) gemacht (wie in den Tipps & Tricks der 10. KSFE) : /* Eine Beispieldatei erstellen */ DATA aufrufe; INPUT pfad $ 1-12 macro $ 14-23; DATALINES; c:/temp/eins macro_eins c:/temp/eins macro_zwei c:/temp/zwei macro_eins ; /* eine temporäre Datei mit dem Code erzeugen */ FILENAME source TEMP; /* die notwendigen SAS-Anweisungen schreiben lassen */ DATA _null_; SET aufrufe;

FILE source; PUT "%INCLUDE '" pfad +(-1) "/" macro +(-1) ".sas';"; PUT "%" macro; RUN; /* das erzeugte Programm ausführen */ %INCLUDE source; Der Code ist weitesgehend identisch. Welche Methode ist besser? Wo liegen evtl. die Vorteile mit dem Katalogeintrag zu arbeiten? Das ist besser 1 March, 2006-18:06 AndreasMangold Danke für den Hinweis. Ihre Methode ist besser. Die mit dem Katalogeintrag hat keine Vorteile, ich hatte nur leider keine Zeit, in die Tipps-und-Tricks-Session der diesjährigen KSFE zu gehen. Dafür gibt es ja Redscope. Es fehlt noch die Fehlerbehandlung 1 March, 2006-14:31 AndreasMangold Eine Fehlerbehandlung fehlt noch. Insbesondere könnte es passieren, dass Makro macro_eins im Pfad c:/temp/zwei nicht gefunden wird und daher Makro macro_eins aus Pfad c:/temp/eins ausgeführt wird, da es ja schon kompiliert wurde. Das kann man verhindern, indem man noch Code einfügt, der das Makro nach dem Ausführen sofort wieder löscht. geht auch als reines Macro 1 March, 2006-16:31 Armageddon Das Problem läß sich auch als reines Macro lösen. In der Tabelle work.macros stehen die Variablen pfad und name. Die entsprechenden Dateien sollten genauso heißen, wie das Macro, sonst muß eine dritte Variable mit dem entsprechenden Macronamen angelegt werden. %macro starten; %let table_id=%sysfunc(open(macros)); /* Tabelle oeffnen */ %let rc=%sysfunc(fetch(&table_id)); /* erstes Obs lesen */ %do %while(&rc eq 0); %let varn=%sysfunc(varnum(&table_id,pfad)); %let pfad=%sysfunc(getvarc(&table_id,&varn)); /* include vorbereiten */ %let varn=%sysfunc(varnum(&table_id,name)); %let name=%sysfunc(getvarc(&table_id,&varn)); %if %sysfunc(fileexist(&pfad./&name) eq 1 %then %do; %include "&pfad./&name"; /* includene */ %&name; /* Macro ausführen */ %end; %let rc=%sysfunc(fetch(&table_id)); %end; %let rc=%sysfunc(close(&table_id)); /* Tabelle wieder schiessen */

%mend; %starten; Gruß Guido Schöne Lösung, ein Bug und ein Vorschlag Das finde ich mal eine schöne Lösung. 1 March, 2006-18:03 AndreasMangold Einen Bug habe ich aber gefunden: es fehlt die schließende Klammer für %sysfunc bei fileexist, die Zeile muss heißen: %if %sysfunc(fileexist(&pfad./&name)) eq 1 %then %do; Vorschlag: Wenn man SAS-Code in <pre> und </pre> einschließt und Einrückungen vornimmt, wird er für uns Redscope-ler besser lesbar. Die Elegantheit der Lösung kommt dann noch besser zur Geltung.