Davy, The code below will generate a data set containing the fully qualified (full path) file names that meets your search criteria (Created < 1 hour AND of Type txt). It's parameter driven, so you can use it with different condition values. Once you have the list of files data set, you can read it and perform your desired processing. Hope this helps, Ahmed /* Input parameters : rootpath and maximal size of members (can be increased) */ %GLOBAL g_constantPath g_currYearIn2Digit g_currentSubmissionPeriod g_rawDataFilePath g_array_size g_searchFileType g_intervalForFileValidation ; %let g_constantPath = c:\SAS\data\users\DDM\OCCI\OCCI_Audit; %let g_currYearIn2Digit = %sysfunc(putn(%sysfunc(date()),year2.)); %let g_currentSubmissionPeriod = &g_currYearIn2Digit.%eval(&g_currYearIn2Digit+1); %let g_rawDataFilePath = &g_constantPath.&g_currentSubmissionPeriod.\Data\Rawdata; %LET g_array_size = 9999; /* maximal size of members (can be increased) */ %LET g_searchFileType = txt; /* Type of file to search for */ %LET g_intervalForFileValidation = 1; /* in hours */ /* ----------------------------------------------------- */ /* Naming convention : functions and routines compiled */ /* by proc FCMP are prefixed with 'x' to single them out */ /* ----------------------------------------------------- */ PROC FCMP OUTLIB=work.funcs.dir; /* -------------------------------------- */ /* New ancillary function : open an entry */ /* -------------------------------------- */ FUNCTION xdiropen(dir $); LENGTH dir $ 256 fref $ 8; *maximal size for filepath is set tup to 256, can be increased; /* a fileref is assigned to the incoming path */ rc = FILENAME(fref, dir); /* path can be accessed ...*/ IF rc = 0 THEN DO; /* .. then create a pointer with DOPEN */ did = DOPEN(fref); /* and free up fileref */ rc = FILENAME(fref); END; /*... else catch exception for inaccessibility */ ELSE DO; msg = SYSMSG(); PUT msg '(XDIROPEN(' dir= ')'; /* return code gets a missing value */ DID = .; END; RETURN(did); ENDSUB; /* ------------------------------------- */ /* Routine XDIRCLOSE : closing the entry */ /* ------------------------------------- */ SUBROUTINE xdirclose(did); OUTARGS did; rc = DCLOSE(did); did = .; ENDSUB; /* --------------------------------------------- */ /* Main Routine XDIR_ENTRIES : recursive listing */ /* input : rootpath (char string) */ /* output : members found below (array character)*/ /* + number of members found + binary Flag */ /* --------------------------------------------- */ SUBROUTINE xdir_entries(dir $, files $, n, trunc); OUTARGS files, n, trunc; LENGTH dir entry $ 256 infoname $60 infoval $256; /* if flag ("trunc") equals 1 then stop - used for array resizing (might be unnecessary with 9.3+) */ IF trunc THEN RETURN; /* Entry opened */ did = XDIROPEN(dir); /* if issue accessing the foldern then exit with error */ IF did <= 0 THEN RETURN; /* Browsing through every entry found */ dnum = DNUM(did); DO i = 1 TO dnum; /* Test : is this entry a mere file ? */ entry = DREAD(did, i); fid = MOPEN(did, entry); entry = TRIM(dir) || '\' || entry; /* A - Yes, entry is a file */ IF fid > 0 THEN DO; /* Extract File's Create Time Information */ infoval=finfo(fid,'Create Time'); /* Calculate the age of the file in hours */ timePassed=intck('HOUR',input(infoval,datetime18.),datetime()); put 'entry=' entry 'Create Time=' infoval 'timePassed in hours=' timePassed; rc = FCLOSE(fid); /* if array dimension is sufficient then we store the pathname */ IF n < DIM(files) THEN DO; trunc = 0; /* Only keep entries of the specified file type */ /* and has not been validated before */ IF ((index(entry,"&g_searchFileType") > 0) AND (timePassed < &g_intervalForFileValidation))THEN DO; n = n + 1; files = entry; END; END; /* ... else we increment Flag */ ELSE DO; trunc = 1; CALL xdirclose(did); RETURN; END; END; ELSE /* B - Entry is not a file but a folder : iterate upon this new root folder */ CALL xdir_entries(entry, files, n, trunc); END; CALL xdirclose(did); RETURN; ENDSUB; QUIT; OPTIONS CMPLIB=work.funcs; /* The table will store the members listed */ DATA File_List(KEEP=file); /* aFiles array assignment ('a' for 'array')*/ ARRAY afiles[&array_size] $ 256 _TEMPORARY_; dnum = 0; trunc = 0; /* recursive browsing through the rootpath and store members found into "afiles" */ CALL xdir_entries("&g_rawDataFilePath", afiles, dnum, trunc); IF trunc THEN PUT 'ERROR: Not enough result array entries. Increase array size.'; /* once array is returned, we write an observation for each value */ DO i = 1 TO dnum; file=afiles; OUTPUT; END; RUN;
... View more