SAS9

Automatisieren der Verarbeitung mehrerer Tabellen in einem Ordner

Simon 9 Aufrufe

Eine häufige Herausforderung für SAS©-Analysten besteht darin, eine Operation (wie ein MERGE zum Hinzufügen einer Spalte) Dutzende Male auf Tabellen im selben Verzeichnis wiederholen zu müssen. Den Makroaufruf %jig(name=AB);, %jig(name=AC);... 50 Mal zu schreiben, ist mühsam und fehleranfällig.

Wie kann man SAS© dazu bringen, das Verzeichnis zu "scannen" und das Makro automatisch auf jede Datei anzuwenden? Hier ist die elegante Methode, vorgeschlagen von WeAreCas, unter Verwendung der SAS©-Metadaten.

1. Die Strategie: Wörterbücher und CALL EXECUTE

Der Ansatz basiert auf zwei Säulen der dynamischen SAS©-Programmierung:

  1. Die Namensliste abrufen: Verwenden Sie die Wörterbuchansichten (SASHELP.VTABLE), um automatisch alles aufzulisten, was sich in einer Bibliothek befindet.

  2. Den Code dynamisch generieren: Verwenden Sie die Anweisung CALL EXECUTE in einem Data Step, um das Makro für jeden gefundenen Namen auszuführen.

2. Der Code Schritt für Schritt

Schritt 0: Das Verarbeitungs-Makro definieren

Dies ist der Code, den der Benutzer für eine einzelne Tabelle ausführen möchte.

1%macro jig(name);
2 DATA datdir.NEW_&name;
3 /* Attention : les deux tables doivent être triées par ID au préalable */
4 MERGE excelsheetdata datdir.&name;
5 BY ID;
6 RUN;
7%mend jig;

3. Analyse der CALL EXECUTE Syntax

In der von WeAreCas vorgeschlagenen Lösung werden Sie eine etwas komplexe Syntax feststellen:

call execute( '%nrstr( %%)' !! 'jig(' !! memname !! ') ' );

Warum %nrstr(%%) ?

  • CALL EXECUTE löst Makros während der Ausführung des Data Step auf.

  • Manchmal möchte man diese Ausführung verzögern oder bestimmte Sonderzeichen schützen.

  • In den meisten einfachen Fällen (wie hier) ist call execute('%jig(' || memname || ')'); ausreichend.

  • Das Hinzufügen von %nrstr dient oft dazu, zu verhindern, dass SAS© versucht, das Makro zu früh aufzulösen, wenn es widersprüchliche Makrovariablen enthält.

Zusammenfassung der Methode

MethodeVorteilNachteil
ManuellEinfach zu verstehen.Lang, repetitiv, Gefahr des Vergessens.
Wildcards (z.B. DATA_: )Schnell für ein einfaches SET.Funktioniert nicht für ein komplexes MERGE.
Wörterbücher + Call ExecuteVollautomatisch, flexibel.Erfordert Kenntnisse in SQL und Metaprogrammierung.

Der technische Tipp: Vergessen Sie nicht, dass für ein funktionierendes MERGE alle Ihre Tabellen (die 50!) zuvor nach der Schlüsselvariablen (ID) sortiert sein müssen. Ist dies nicht der Fall, müssen Sie eine PROC SORT in Ihr Makro %jig einfügen.

Schritt 1: Zieltabellen auflisten (PROC SQL)

Anstatt die Namen manuell einzugeben, fragen wir SAS©: "Gib mir die Liste aller nicht leeren Tabellen, die in der Bibliothek 'DATDIR' vorhanden sind."

1
 
1PROC SQL;
2 create TABLE liste_tables as
3 select memname
4 from sashelp.vtable
5 where LIBNAME='DATDIR' /* Nom de la lib en MAJUSCULES */
6 and memname like 'DATA_%'; /* Filtre optionnel si besoin */
7QUIT;
Hinweis: SASHELP.VTABLE enthält die Metadaten aller aktiven Tabellen.
Note :
Schritt 2: Die Automatisierung (CALL EXECUTE)
Hier geschieht die Magie. Wir durchlaufen die in Schritt 1 erstellte Liste, und für jede Zeile wird ein Textbefehl erstellt, der das Makro aufruft.
1DATA _null_;
2 SET liste_tables;
3
4 /* Construction de la chaîne : '%jig(TABLE_1)' */
5 commande = '%jig(' || strip(memname) || ')';
6
7 /* Exécution immédiate de cette commande */
8 call execute(commande);
9RUN;