Truco SAS: Dataset con los ficheros y carpetas de un directorio.

3 Mar

En ocasiones necesitamos listar los archivos de un directorio. En SAS se puede hacer así. Creamos una tabla en WORK archivos con los nombres de los archivos y subcarpetas de un directorio:

/*PONE ARCHIVOS DE UN DIRECTORIO EN TABLA SAS*/
%macro archivos(directorio);
data archivos;
rc=filename('dir',"&directorio.");
dirid=dopen('dir');
numarchivos=dnum(dirid);
do i=1 to numarchivos;
nombrearchivos=dread(dirid,i);
output;
end;
rc=close(dirid);
drop rc i;
run;
%mend archivos; /*EJEMPLO SI QUEREMOS QUE NOS LISTE LAS TABLAS
SAS DEL WORK*/
proc sql noprint;
select path into:ub_work
from sashelp.vlibnam
where libname = "WORK";
quit;
%archivos(&ub_work.); data archivos;
set archivos;
where index(lowcase(nombrearchivos),"sas7bdat")>1;
run;

Puede sernos de gran utilidad cuando deseemos importar un gran número de ficheros de texto o si necesitamos manejarnos con archivos y shell, empleamos las funciones de "archivo" de SAS (en breve pondré un artículo sobre las funciones SAS). El programa se puede sofisticar empleando extensiones, eliminando carpetas,... Espero vuestros comentarios y mejoras sobre el uso de esta macro.

Compartiendo conocimientos.

13 respuestas a «Truco SAS: Dataset con los ficheros y carpetas de un directorio.»

  1. Alex, sería conveniente que nos dieses pistas de qué es lo que no te funciona, porque el problema puede estar en tu equipo y el código funcionar perfectamente en el de Raúl… Revisa el log y dinos cuál es el primer mensaje de error que te genera el código.

    Saludos.

  2. ERROR: Información de control de bucle DO no válida, falta la expresión INITIAL o TO, o bien falta
    la expresión BY, es cero, o no es válida.
    rc=0 dirid=0 numarchivos=. i=1 nombrearchivos= _ERROR_=1 _N_=1

    ERROR: La variable gt no está en el fichero WORK.ARCHIVOS.
    ERROR 180-322: La sentencia no es válida o no está en el lugar correcto.

    Estos son los dos errores.
    Si quereis el log entero os lo puedo enviar, pero incluso eliminando la parte que no es codigo no me tira. :(

  3. Prueba esto:

    %macro archivos(directorio);
    data archivos;
    rc=filename(‘dir’,»&directorio.»);
    dirid=dopen(‘dir’);
    numarchivos=dnum(dirid);
    do i=1 to numarchivos;
    nombrearchivos=dread(dirid,i);
    output;
    end;
    rc=close(dirid);
    drop rc i;
    run;
    %mend archivos;

    /*EJEMPLO SI QUEREMOS QUE NOS LISTE LAS TABLAS
    SAS DEL WORK*/

    proc sql noprint;
    select path into:ub_work
    from sashelp.vslib
    where libname = «WORK»;
    quit;

    %archivos(&ub_work.);

    data archivos;
    set archivos;
    where index(lowcase(nombrearchivos),»sas7bdat»)>=1;
    run;

    Es un problema del wordpress y de una castaña de plugin.

  4. buenos dias

    Muchas gracias me fue de gran utilidad pero el servidor sas lo ocupan varios y quisiera me puedan apoyar, para que me liste el usuario , trate agregando ‘user’ pero no lista , Gracias por su apoyo

  5. necesito ayuda con el siguiente error de sas

    al ejecutar la siguiente query me aparece el siguiente error «Error: fallo en la inicilaizacion de clasificacion»
    PROC SQL;
    CREATE TABLE prueba AS
    SELECT DISTINCT T1.*,
    t2.BGSB_FEC_TRAS_CVENC,
    t2.CLISEGL1,
    t2.CLISEGL2,
    t2.BDSITU,
    t2.FECSIT,
    t2.FECMARC,
    t2.FSALIDA,
    t2.IDPUNSCO,
    t2.FECCALI,
    t2.FECCADUC,
    t2.TIPO,
    t2.TIPMODE2,
    t2.SCORE_MES,
    t2.TIPO_ORIG,
    t2.MODELO_ORIG,
    t2.SCORE_ORIG,
    t2.CLASIFICACION,
    t2.FECV2,
    t2.GEST_SIT,
    t2.GES2_SIT,
    t2.FECHAPER,
    t2.IDPRO_LC,
    t2.IDSUCUR,
    t2.TIP_PERS,
    t2.FECREFI,
    t2.FECREES,
    t2.Procentaje_Uso,
    t2.Limite,
    t2.Gtia_Reales,
    t2.Gtia_Lsg,
    t2.Gtia_Personales,
    t2.Gtia_Financieras,
    t2.LTV,
    t2.Plazo_Residual,
    t2.Residual_year,
    t2.BGSB_STD_LTV,
    t2.TASA_DESC,
    t2.IND_CURA,
    t2.BGSB_PRODUCTO_Marca_Hip,
    t2.BGSB_SISTEMA_ORIGEN,
    t2.Default_mes,
    t2.Preco_Meses,
    T2.SALDO_DISP_1,
    t2.Acid_LGD1,
    T2.Saldo_Act_1,
    T2.Acid_PM1
    FROM SASBASE.IFRS9_RETAIL_201709_V1_42_VAL T1
    LEFT JOIN sasbase.TABLA_RETAILC_VAL1_201709_v1 T2
    ON (t1.BGSB_ID_NUMERO_OPERAC = t2.BGSB_ID_NUMERO_OPERAC)
    AND (t1.BGSB_NRT = t2.BGSB_NRT)
    AND (t1.BGSB_ID_PRODUCTO_ALT = t2.BGSB_ID_PRODUCTO_ALT)
    AND (t1.BGSB_ID_SUBPROD_ALT = t2.BGSB_ID_SUBPROD_ALT);
    QUIT;

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *