From 19a13367209171855183d7a5619fc8d14ffe9b79 Mon Sep 17 00:00:00 2001 From: Ivor Townsend Date: Fri, 26 Nov 2021 09:29:42 +0000 Subject: [PATCH] feat: Recursive Directory Listing --- base/mp_dirlist.sas | 49 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/base/mp_dirlist.sas b/base/mp_dirlist.sas index e827f5a..6354542 100644 --- a/base/mp_dirlist.sas +++ b/base/mp_dirlist.sas @@ -44,8 +44,12 @@ - filename (just the file name) - ext (.extension) - msg (system message if any issues) + - level (depth of folder) - OS SPECIFIC variables, if getattrs= is used. +

SAS Macros

+ @li mp_dropmembers.sas + @version 9.2 @author Allan Bowe **/ @@ -54,14 +58,26 @@ , fref=0 , outds=work.mp_dirlist , getattrs=NO + , level=0 /* The level of recursion to perform. For internal use only. */ )/*/STORE SOURCE*/; %let getattrs=%upcase(&getattrs)XX; -data &outds(compress=no - keep=file_or_folder filepath filename ext msg directory +/* temp table */ +%local out_ds; +data;run; +%let out_ds=%str(&syslast); + +/* drop main (top) table if it exists */ +%if &level=0 %then %do; + %mp_dropmembers(&outds, libref=WORK) +%end; + +data &out_ds(compress=no + keep=file_or_folder filepath filename ext msg directory level ); length directory filepath $500 fref fref2 $8 file_or_folder $6 filename $80 ext $20 msg $200; + retain level &level; %if &fref=0 %then %do; rc = filename(fref, "&path"); %end; @@ -119,8 +135,8 @@ data &outds(compress=no run; %if %substr(&getattrs,1,1)=Y %then %do; - data &outds; - set &outds; + data &out_ds; + set &out_ds; length infoname infoval $60 fref $8; rc=filename(fref,filepath); drop rc infoname fid i close fref; @@ -161,10 +177,33 @@ run; run; proc sort; by filepath sasname; - proc transpose data=&outds out=&outds(drop=_:); + proc transpose data=&out_ds out=&out_ds(drop=_:); id sasname; var infoval; by filepath file_or_folder filename ext ; run; %end; + +/* update main table */ +proc append base=&outds data=&out_ds; +run; + +data &outds; + set &outds(where=(filepath ne '')); +run; + +/* recursive call */ +data _null_; + set &out_ds; + where file_or_folder='folder'; + code=cats('%nrstr(%mp_dirlist(path=',filepath,",outds=&outds" + ,",getattrs=&getattrs,level=%eval(&level+1)))"); + put code=; + call execute(code); +run; + +/* tidy up */ +proc sql; +drop table &out_ds; + %mend mp_dirlist; \ No newline at end of file