SAS9

Automatizar la fusión de tablas con nombres no convencionales

Simon 9 Aufrufe

En el universo SAS©, es común tener que consolidar datos históricos almacenados en una misma librería. Si la operación es trivial con nombres de archivo estandarizados (ej: DATA_202301, DATA_202302), se vuelve peligrosa cuando los archivos provienen de importaciones de Excel o de sistemas heredados que utilizan espacios, símbolos ($, &) o formatos de "texto libre".

Este artículo le muestra cómo concatenar dinámicamente todo el contenido de una librería, incluso cuando los nombres de las tablas parecen imposibles de manejar por programación.

Automatizar la fusión de tablas con nombres no convencionales -

El Escenario: Archivos de RR.HH. desordenados

Tomemos el ejemplo de una librería llamada RH_ARCHIVE. Contiene exportaciones mensuales nombradas de manera muy literal, incluyendo espacios y caracteres especiales:

  • 'JANVIER 2024 STAFFING$'

  • 'FEVRIER 2024 - HEURES SUP'

  • 'MARS 2024 & PRIMES'

Si intenta un enfoque clásico recuperando la lista de tablas a través de dictionary.tables para inyectarla en un paso DATA, SAS© fallará.

¿Por qué? Porque SAS© interpreta 'MARS 2024 & PRIMES' como tres objetos distintos (MARS, 2024, &, PRIMES). Además, sin una referencia explícita a la librería, buscará estas tablas en WORK.

Inevitablemente obtendrá el error:

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

La Solución: La sintaxis "Name Literal" dinámica

Para manipular estas tablas, SAS© requiere una sintaxis precisa llamada "Name Literal" (literal de nombre), que se ve así: 'Nombre de la tabla'n. También es imperativo prefijar el nombre de la librería.

En lugar de escribir el código a mano para cada archivo, vamos a utilizar PROC SQL para generar la sintaxis exacta.

El Código Optimizado

El objetivo es construir una cadena de caracteres que se parezca a: RH_ARCHIVE.'JANVIER 2024 STAFFING$'n

Aquí está el código para automatizar esto a través de la función CATT:

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;

Descifrando el método

  • quote(MEMNAME): Esta función rodea el nombre recuperado (ej: MARS 2024 & PRIMES) con comillas dobles. Esto "protege" los espacios y los caracteres especiales.

  • 'n': Al pegar este sufijo después de las comillas, se indica al motor de SAS© que no es una cadena de texto, sino un nombre de tabla válido (un literal).

  • 'RH_ARCHIVE.': Forzamos la ubicación de la fuente. Sin esto, SAS© no encontraría el archivo físico.

  • Esta técnica es universal: funciona sin importar la "limpieza" de los nombres de sus archivos de origen. Sin embargo, para sus futuras tablas, prefiera siempre la norma estándar de SAS© (sin espacios, uso del guion bajo _, sin caracteres especiales) para facilitar el mantenimiento de sus programas.