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.
A mi no me funciona esta aplicación.
¿Podrías revisarla a ver si ay algo que este mal?
Gracias.
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.
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.
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. :(
Ojo, no es solo eliminar lo que no es código, también se han cambiado los & por & y gt por >
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.
como meter datos en sas sin que se muevan en el editor? directamente.
Hola francisca, no entiendo muy bien tu pregunta. ¿Quieres meter datos desde el editor? Para eso mejor usa Excel y posteriormente importas. Saludos.
Que tal como puedo comparar el contenido de dos archivos .txt
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
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;
Elimina el DISTINCT y prueba
hola, que tal, como puedo crear una macro para hacer un respaldo de librerias?