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 pensiamientos en “Truco SAS: Dataset con los ficheros y carpetas de un directorio.

  • Alex

    A mi no me funciona esta aplicación.
    ¿Podrías revisarla a ver si ay algo que este mal?

    Gracias.

    Responder
  • ffernandez

    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.

    Responder
  • rvaquerizo

    Es evidente porque no te funciona. El problema es de un plugin de wordpress para emplear el código semafórico de SAS. Elimina la parte del código que no es SAS.

    Responder
  • Alex

    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. :(

    Responder
  • ffernandez

    Ojo, no es solo eliminar lo que no es código, también se han cambiado los & por & y gt por >

    Responder
  • rvaquerizo

    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.

    Responder
  • francisca

    como meter datos en sas sin que se muevan en el editor? directamente.

    Responder
  • rvaquerizo

    Hola francisca, no entiendo muy bien tu pregunta. ¿Quieres meter datos desde el editor? Para eso mejor usa Excel y posteriormente importas. Saludos.

    Responder
  • Hamdop

    Que tal como puedo comparar el contenido de dos archivos .txt

    Responder
  • SALVADOR GRENADOS

    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

    Responder
  • Manuel Gomez

    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;

    Responder
  • raisa

    hola, que tal, como puedo crear una macro para hacer un respaldo de librerias?

    Responder

Deja un comentario

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