SAS9

Automatisierung der Zusammenführung von Tabellen mit nicht-konventionellen Namen

Simon 7 vues

Im SAS©-Universum ist es üblich, historische Daten zu konsolidieren, die in derselben Bibliothek gespeichert sind. Während der Vorgang mit standardisierten Dateinamen (z.B. DATA_202301, DATA_202302) trivial ist, wird er gefährlich, wenn die Dateien aus Excel-Importen oder Altsystemen stammen, die Leerzeichen, Symbole ($, &) oder „Freitext“-Formate verwenden.

Dieser Artikel zeigt Ihnen, wie Sie den gesamten Inhalt einer Bibliothek dynamisch verketten können, selbst wenn die Tabellennamen programmatisch unmöglich zu handhaben scheinen.

Automatisierung der Zusammenführung von Tabellen mit nicht-konventionellen Namen -

Das Szenario: Ungeordnete HR-Archive

Nehmen wir das Beispiel einer Bibliothek namens RH_ARCHIVE. Sie enthält monatliche Exporte, die sehr wörtlich benannt sind und Leerzeichen sowie Sonderzeichen enthalten:

  • 'JANUAR 2024 STAFFING$'

  • 'FEBRUAR 2024 - ÜBERSTUNDEN'

  • 'MÄRZ 2024 & PRÄMIEN'

Wenn Sie einen klassischen Ansatz versuchen, indem Sie die Liste der Tabellen über dictionary.tables abrufen und in einen DATA-Schritt einfügen, wird SAS© fehlschlagen.

Warum? Weil SAS© 'MÄRZ 2024 & PRÄMIEN' als drei separate Objekte interpretiert (MÄRZ, 2024, &, PRÄMIEN). Außerdem wird es ohne expliziten Verweis auf die Bibliothek diese Tabellen in WORK suchen.

Sie werden unweigerlich den Fehler erhalten:

ERROR: THE DATA SET NAME CANNOT HAVE MORE THAN 32 CHARACTERS oder ERROR: FILE DOES NOT EXIST.

Die Lösung: Die dynamische „Name Literal“-Syntax

Um diese Tabellen zu bearbeiten, erfordert SAS© eine präzise Syntax, die als „Name Literal“ (Namensliteral) bezeichnet wird und wie folgt aussieht: 'Tabellenname'n. Es ist auch zwingend erforderlich, den Bibliotheksnamen voranzustellen.

Anstatt den Code für jede Datei manuell zu schreiben, verwenden wir PROC SQL, um die exakte Syntax zu generieren.

Der optimierte Code

Das Ziel ist es, eine Zeichenkette zu erstellen, die so aussieht: RH_ARCHIVE.'JANUAR 2024 STAFFING$'n

Hier ist der Code, um dies mit der Funktion CATT zu automatisieren:

1/* 1. Construction de la liste des tables avec la syntaxe Name Literal */
2PROC SQL;
3 SELECT catt('RH_ARCHIVE.', quote(MEMNAME), 'n')
4 INTO :LISTE_A_FUSIONNER SEPARATED BY ' '
5 FROM dictionary.tables
6 WHERE LIBNAME = 'RH_ARCHIVE';
7QUIT;
8 
9/* 2. Contrôle du résultat dans la log */
10%PUT &=LISTE_A_FUSIONNER;
11 
12/* 3. Fusion des données */
13DATA CONSOLIDATION_RH;
14 SET &LISTE_A_FUSIONNER.;
15RUN;

Entschlüsselung der Methode

  • quote(MEMNAME): Diese Funktion umschließt den abgerufenen Namen (z.B. MÄRZ 2024 & PRÄMIEN) mit doppelten Anführungszeichen. Dies „schützt“ die Leerzeichen und Sonderzeichen.

  • 'n': Indem man dieses Suffix nach den Anführungszeichen anfügt, teilt man der SAS©-Engine mit, dass es sich nicht um eine Textzeichenfolge, sondern um einen gültigen Tabellennamen (ein Literal) handelt.

  • 'RH_ARCHIVE.': Man erzwingt den Speicherort der Quelle. Ohne dies würde SAS© die physische Datei nicht finden.

  • Diese Technik ist universell: Sie funktioniert unabhängig von der „Sauberkeit“ Ihrer Quelldateinamen. Bevorzugen Sie jedoch für Ihre zukünftigen Tabellen immer den SAS©-Standard (keine Leerzeichen, Verwendung des Unterstrichs _, keine Sonderzeichen), um die Wartung Ihrer Programme zu erleichtern.