1
0
mirror of https://github.com/sasjs/core.git synced 2026-01-16 04:50:05 +00:00

feat: Recursive Directory Listing

This commit is contained in:
Ivor Townsend
2021-11-26 09:29:42 +00:00
parent 5225e74465
commit 19a1336720

View File

@@ -44,8 +44,12 @@
- filename (just the file name) - filename (just the file name)
- ext (.extension) - ext (.extension)
- msg (system message if any issues) - msg (system message if any issues)
- level (depth of folder)
- OS SPECIFIC variables, if <code>getattrs=</code> is used. - OS SPECIFIC variables, if <code>getattrs=</code> is used.
<h4> SAS Macros </h4>
@li mp_dropmembers.sas
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
**/ **/
@@ -54,14 +58,26 @@
, fref=0 , fref=0
, outds=work.mp_dirlist , outds=work.mp_dirlist
, getattrs=NO , getattrs=NO
, level=0 /* The level of recursion to perform. For internal use only. */
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%let getattrs=%upcase(&getattrs)XX; %let getattrs=%upcase(&getattrs)XX;
data &outds(compress=no /* temp table */
keep=file_or_folder filepath filename ext msg directory %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 length directory filepath $500 fref fref2 $8 file_or_folder $6 filename $80
ext $20 msg $200; ext $20 msg $200;
retain level &level;
%if &fref=0 %then %do; %if &fref=0 %then %do;
rc = filename(fref, "&path"); rc = filename(fref, "&path");
%end; %end;
@@ -119,8 +135,8 @@ data &outds(compress=no
run; run;
%if %substr(&getattrs,1,1)=Y %then %do; %if %substr(&getattrs,1,1)=Y %then %do;
data &outds; data &out_ds;
set &outds; set &out_ds;
length infoname infoval $60 fref $8; length infoname infoval $60 fref $8;
rc=filename(fref,filepath); rc=filename(fref,filepath);
drop rc infoname fid i close fref; drop rc infoname fid i close fref;
@@ -161,10 +177,33 @@ run;
run; run;
proc sort; proc sort;
by filepath sasname; by filepath sasname;
proc transpose data=&outds out=&outds(drop=_:); proc transpose data=&out_ds out=&out_ds(drop=_:);
id sasname; id sasname;
var infoval; var infoval;
by filepath file_or_folder filename ext ; by filepath file_or_folder filename ext ;
run; run;
%end; %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; %mend mp_dirlist;