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:
@@ -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;
|
||||||
Reference in New Issue
Block a user