Guía SAS VIYA

Tutorial SAS Viya: Importar un archivo de texto sin encabezado y renombrar columnas dinámicamente

Simon 8 views

Al importar archivos planos (CSV, TXT) en SAS© Viya a través de PROC IMPORT, un escenario frecuente plantea un problema: el archivo de datos no contiene una línea de encabezado, y los nombres de las columnas se proporcionan por separado (por ejemplo, en un documento de Word o Excel).

Por defecto, si utiliza la opción GETNAMES=NO, SAS© genera nombres genéricos (VAR1, VAR2, VAR3...).

¿Cómo aplicar eficazmente sus propios nombres de columna sin tener que renombrar manualmente cada variable, especialmente si el archivo contiene docenas? Aquí hay dos enfoques: el método rápido para unas pocas variables, y la automatización completa para archivos grandes.

1. El Método Estándar (PROC IMPORT + RENAME)

Si tiene pocas columnas, la solución más sencilla es importar el archivo tal cual y luego renombrar las variables a posteriori.

Paso 1: Importación bruta

Utilice la opción GETNAMES=NO para indicar a SAS© que la primera línea ya contiene datos.

1FILENAME LOC DISK '/workspace/workbench/myorg/data/home/olddatatoimport.txt';
2 
3PROC IMPORT DATAFILE=LOC
4 DBMS=DLM
5 OUT=WORK.NEWDATA
6 REPLACE;
7 DELIMITER=','; /* ou '09'x pour tabulation */
8 GETNAMES=NO; /* Crucial : évite de perdre la 1ère ligne de données */
9RUN;

Paso 2: Renombrado manual

Utilice PROC DATASETS para modificar los nombres sin volver a leer todos los datos (muy rápido incluso en grandes volúmenes).

1PROC DATASETS library=WORK nolist;
2 modify NEWDATA;
3 rename
4 VAR1 = State
5 VAR2 = City
6 VAR3 = Population;
7QUIT;

2. El Método Automatizado (Renombrado Dinámico)

Si tiene 50 o 100 columnas listadas en un documento externo, el método manual es tedioso y una fuente de errores. Aquí le mostramos cómo automatizar el proceso generando dinámicamente la instrucción RENAME.

El Concepto

  1. Importar el archivo de datos con los nombres genéricos (VAR1, VAR2...).

  2. Importar la lista de nombres de columna (copiada de su documento de Word/Excel) en una tabla SAS©.

  3. Utilizar un Data Step para construir una macro-variable que contenga el par VAR1=NuevoNombre VAR2=OtroNombre.

  4. Aplicar esta macro en PROC DATASETS.

El Código Completo

Fase A: Crear la tabla de nombres Copie su lista de columnas desde Word y péguela en el siguiente código:

1/* Table contenant vos noms de colonnes dans l'ordre du fichier */
2DATA column_names;
3 LENGTH new_name $32;
4 INPUT new_name;
5 DATALINES;
6State
7City
8ZipCode
9Population
10Revenue
11/* ... collez votre liste ici ... */
12;
13RUN;

Fase B: Generar el script de renombrado Este código recorre la lista de nombres y construye una cadena de caracteres del tipo: VAR1=State VAR2=City ...

1DATA _null_;
2 SET column_names END=last;
3
4 LENGTH rename_list $32000;
5 retain rename_list;
6
7 /* On concatène : "VAR" + numéro de ligne = "Nouveau Nom" */
8 /* cats('VAR', _n_) génère VAR1, VAR2, etc. basée sur le numéro de ligne */
9 rename_list = catx(' ', rename_list, catx('=', cats('VAR',_n_), new_name));
10
11 /* À la fin, on stocke tout dans une variable macro &PAIRES_RENAME */
12 IF last THEN call symputx('PAIRES_RENAME', rename_list);
13RUN;
14 
15/* Vérification dans le journal */
16%put &PAIRES_RENAME;

Fase C: Aplicar el cambio

1/* Importation des données brutes */
2PROC IMPORT datafile='/chemin/mon_fichier.txt' dbms=dlm out=work.raw_data replace;
3 getnames=no;
4RUN;
5 
6/* Renommage éclair */
7PROC DATASETS library=work nolist;
8 modify raw_data;
9 rename &PAIRES_RENAME;
10QUIT;

Alternativa: El paso DATA (Control Total)

Si su archivo es complejo (fechas específicas, formatos numéricos particulares), PROC IMPORT a veces puede adivinar incorrectamente los tipos de datos. En este caso, el método más robusto es escribir un paso DATA clásico.

En lugar de dejar que SAS© adivine VAR1, VAR2, usted declara directamente sus variables:

1DATA work.newdata;
2 INFILE '/workspace/workbench/myorg/data/home/olddatatoimport.txt'
3 dsd /* Gère les délimiteurs et les valeurs manquantes */
4 dlm=',' /* Délimiteur */
5 truncover; /* Évite les erreurs si une ligne est trop courte */
6
7 /* Définissez vos noms et types ici */
8 INPUT
9 State :$2.
10 City :$50.
11 Population :best.
12 Revenue :comma10.;
13RUN;
  • Para una necesidad rápida: PROC IMPORT (GetNames=No) + PROC DATASETS.

  • Para un gran número de columnas: Automatización a través de Macro-Variable.

  • Para un control preciso de los tipos: DATA Step con INPUT.