creating a directory listing using sas for windows in topdown order
Post on 29-May-2018
221 Views
Preview:
TRANSCRIPT
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
1/12
Creating a Directory Listing Using SAS for Windows in TopDown order
Here I present a SAS macro to Create a directory listing using SAS for Windows in TopDown order...
SAS Institute has provided a macro to Create a directory listing using SAS for Windows (http://support.sas.com/kb/24/820.html)....I
have added additional steps to massage the results and provide a report which gives the results in descending order of the file size....
The macro provides options for
- Traversing sub-dirs based on a limit specified
- reporting the results
- limiting results based on size(mention in MB)
- based on date.
I've used this macro to check for space issues on network folders at work....
I hope it suits your situation....
Read more: http://sastechies.blogspot.com/2010/07/creating-directory-listing-using-sas.html
Taking an example of C:\Intel...
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
2/12
The dirlist dataset has the records...
The final dataset
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
3/12
Top Down dataset
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
4/12
%macro DIRLISTWIN( PATH /* Windows path of directory to examine */
, MAXDATE= /* [optional] maximum date/time of file to report */, MINDATE= /* [optional] minimum date/time of file to report */
, MAXSIZE= /* [optional] maximum size of file to report (MB) */
, MINSIZE= /* [optional] minimum size of file to report (MB) */
, OUT= /* [optional] name of output file containing results of %DIRLISTWIN */
, REPORT=Y /* [optional] flag controlling report creation */
, SUBDIR=Y /* [optional] include subdirectories in directory processing */
, MAXLEVRPT=3/* [optional] Max Levels of subdirectories summarization Required
*/
) ;
/* PURPOSE: create listing of files in specified directory to make evident
*
* NOTE: %DIRLISTWIN is designed to be run on SAS installations using the Windows O/S
*
* NOTE: &PATH must contain valid Windows path, e.g., 'c:' or 'c:\documents and settings'
*
* NOTE: &MAXDATE and &MINDATE must be SAS date/time constants in one of the following formats:
* 'ddMONyy:HH:MM'dt *** datetime constant ***
* 'ddMONyy'd *** date constant **** 'HH:MM't *** time constant ***
*
* NOTE: if &SUBDIR = Y then all subdirectories of &PATH will be searched
* otherwise, only the path named in &PATH will be searched
*
* NOTE: uses Windows pipe option on file reference
*
* NOTE: if %DIRLISTWIN is used successively in the same job, then
* the report will contain the cumulative directory listing of all directories searched
* a separate &OUT dataset will be created for each %DIRLISTWIN invocation
*
* USAGE:
* %DIRLISTWIN( c:/data1 )
* %DIRLISTWIN( c:/data1, MINDATE='01JAN04:00:00:00'dt, MAXDATE='16MAR04:23:59:59'dt )
* %DIRLISTWIN( c:/data1, MINDATE='00:00:00't, MAXDATE='23:59:59't, MINSIZE=1000000 )
* %DIRLISTWIN( d:/data2, REPORT=Y )
* %DIRLISTWIN( d:, OUT=LIBNAME.DSNAME, REPORT=N )
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
5/12
* %DIRLISTWIN( d:/documents and settings/robett/my documents/my sas files/v8 )
** ALGORITHM:
* use Windows pipe with file reference to execute 'dir' command to obtain directory contents
* parse pipe output as if it were a file to extract file names, other info
* [optional] select files that are within the time interval [ &MINDATE, &MAXDATE ]
* [optional] select files that are at least as large as &MINSIZE bytes and no larger than &MAXSIZE
* sort records by owner, path, filename
* [optional] create report of files per owner/path if requested
* [optional] create 1-line report of files per owner/path if requested
*/
%let DELIM = ' ' ;
%if%upcase( &SUBDIR ) = Y %then%let SUBDIR = /s ; %else%let SUBDIR = ;
/*============================================================================*/
/* external storage references
/*============================================================================*/
/* run Windows "dir" DOS command as pipe to get contents of data directory */
filename DIRLIST pipe "dir /-c /q &SUBDIR /t:c ""&PATH""" ;
/*############################################################################*/
/* begin executable code
/*############################################################################*/
/* use Windows pipe to recursively find all files in &PATH
* parse out extraneous data, including unreadable directory paths
* process files >= &MINSIZE in size
*
* directory list structure:
* "Directory of" record precedes listing of contents of directory:
*
* Directory of \ [ \ \... ]
* mm/dd/yy hh:mm:ss [AM|PM] ['' | size ] filename.type
*
* example:
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
6/12
*
* Volume in drive C is WXP* Volume Serial Number is 18C2-3BAA
*
* Directory of C:\Documents and Settings\robett\My Documents\My SAS Files\V8\Test
*
* 05/21/03 10:58 AM CARYNT\robett .
* 05/21/03 10:58 AM CARYNT\robett ..
* 12/24/03 10:22 AM CARYNT\robett Codebook
* 04/23/01 02:42 PM 387 CARYNT\robett printCharMat.sas
* 10/09/03 11:35 AM 20582 CARYNT\robett test.log
* 10/28/03 08:02 AM 58682 CARYNT\robett test.lst
* 10/09/03 11:35 AM 1575 CARYNT\robett test.sas
*/
/* drop these datasets if already exists */
proc sql;
drop table dirlist;
drop table report;
quit;
/*Count the number of the Initial Directory levels in the Rootpath for eg. C:\Temp i.e. 2 */
data _null_;
initpath="&PATH";
dirlevels=count(initpath,'\')+1;
call symputx('lvlsinitpath',dirlevels);
run;
/*Count the number of the Initial Directory levels */
data dirlist ;
length path filename $255 line $1024 owner $17 temp $16 ;
retain path ;
infile DIRLIST length=reclen ;
input line $varying1024. reclen ;
if reclen = 0 then delete ;
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
7/12
if scan( line, 1, &DELIM ) = 'Volume' | /* beginning of listing */
scan( line, 1, &DELIM ) = 'Total' | /* antepenultimate line */scan( line, 2, &DELIM ) = 'File(s)' | /* penultimate line */
scan( line, 2, &DELIM ) = 'Dir(s)' /* ultimate line */
then delete ;
dir_rec = upcase( scan( line, 1, &DELIM )) = 'DIRECTORY' ;
/* parse directory record for directory path
* parse non-directory record for filename, associated information
*/
if dir_rec
then
path = left( substr( line, length( "Directory of" ) + 2 )) ;
else do ;
date = abs(input( scan( line, 1, &DELIM ), mmddyy10. )) ;
time = input( scan( line, 2, &DELIM ), time5. ) ;
post_meridian = ( scan( line, 3, &DELIM ) = 'PM' ) ;
if post_meridian then time = time + '12:00:00'T ; /* add 12 hours to represent on 24-hour clock */
temp = scan( line, 4, &DELIM ) ;
if temp = '' then size = 0 ; else size = input( temp, best. ) ;
owner = scan( line, 5, &DELIM ) ;
/* scan delimiters cause filename parsing to require special treatment */
filename = scan( line, 6, &DELIM ) ;
if filename in ( '.''..' ) then delete ;
ndx = index( line, scan( filename, 1 )) ;
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
8/12
filename = substr( line, ndx ) ;end ;
/* date/time filter */
%if%eval( %length( &MAXDATE ) + %length( &MINDATE ) > 0 )
%then%do ;
if not dir_rec
then do ;
datetime = input( put( date, date7. ) || ':' || put( time, time5. ), datetime13. ) ;
%if%length( &MAXDATE ) > 0%then%str( if datetime 0%then%str( if datetime >= &MINDATE ; ) ;
end ;
%end ;
sizeMB=size/(1024*1024); /*Size in MB*/
sizeGB=size/(1024*1024*1024); /*Size in GB*/
drop dir_rec line ndx post_meridian temp ;dirlevels=count(path,'\')+1;
format sizeMB sizeGB comma10.2 date mmddyy10.;
run ;
proc sort data=dirlist out=dirlist ; by owner path filename ; run ;
/*============================================================================*/
/* add data for current directory path to cumulative report dataset
/*============================================================================*/
proc append base=report data=dirlist ; run ;
/*============================================================================*/
/* break association to previous path prior to next %DIRLISTWIN invocation
/*============================================================================*/
filename DIRLIST clear ;
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
9/12
/*-------------Code specific to the Jimmy's Requirement --------*/proc sql;
select max(dirlevels) into :maxLevels
from dirlist;
quit;
%let maxLevels=&maxLevels;
%put maxLevels=&maxLevels;
proc sort data=dirlist; by path; run;
data dirlistSize;length previous $ 100;
retain previous;
set dirlist;
array brklevels{&maxLevels} $100; * _temporary_ ;
array levels{&maxLevels} $100 level1-level&maxLevels ;
previous='';
do i=1 to dirlevels;
brklevels(i)=scan(path,i,'\');levels(i)=strip(previous)||"\"||strip(brklevels(i));
if i=1 then levels(i)=strip(substr(levels(i),2));
previous=levels(i);
end;
*if path="&PATH" and compress(filename) eq '' then delete;
if compress(filename) eq '' then delete;
format size sizeMB sizeGB comma16.2 ;
if size gt 0;
run;
%macrolevels;
%do i=&lvlsinitpath.%to%eval(&maxlev -1);
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
10/12
select distinct level&i. AS Path, sum(size) as Size
format=comma10.2,sum(size)/(1024*1024) as SizeMB format=comma10.2,sum(size)/(1024*1024*1024) as SizeGBformat=comma10.2
from dirlistSize
where level&i. ne ''
group by level&i.
UNION
%end;
%mend levels;
%if%eval(&lvlsinitpath. + &MAXLEVRPT.) gt &maxLevels %then%do; %let maxlev=&maxLevels; %end;
%else %let maxlev=%eval(&lvlsinitpath. + &MAXLEVRPT.);
%put maxLevels=&maxLevels lvlsinitpath=&lvlsinitpath MAXLEVRPT=&MAXLEVRPT maxlev=&maxlev;
procsqlfeedback;
createtable prefinal as
%levels
selectdistinct level&maxlev.AS Path, sum(size) as Size format=comma10.2,sum(size)/(1024*1024)
as SizeMB format=comma10.2,sum(size)/(1024*1024*1024) as SizeGB format=comma10.2
from dirlistSize
where level&maxlev. ne ''
group by level&maxlev.
orderby Path,size desc;
QUIT;
data final;
set prefinal;
dirlevels=count(path,'\')+1;
/*Size filter*/
%if%length( &MAXSIZE ) > 0%then%str( if sizeMB 0%then%str( if sizeMB >= &MINSIZE ; ) ;
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
11/12
run;
procsortdata=final out=TopDown; by dirlevels descending size; run;
%if &REPORT eq Y
%then%do ;
odslistingclose;
odshtmlfile="&OUT.";
title1"Directory Listing and Size greater than &MINSIZE. (MB) " ;
title2"at Location: &PATH" ;
procreportcenterdata=TopDown headskipnowindowsspacing=1split='\' ;
column path size sizeMB sizeGB; * dirlevels;define path / display width=17 'Path' ;
define size / displayformat=comma16.2'Size in Bytes' ;
define sizeMB / displayformat=comma16.2'Size in MB' ;
define sizeGB / displayformat=comma16.2 'Size in GB' ;
*define dirlevels / display 'Sub Directory Levels' ;
run ;
title ;
odshtmlclose; odslisting;
%end ;
%mend DIRLISTWIN ;
%let outxls=C:\DirSpaceListing_&sysdate9..xls;
%DIRLISTWIN(C:\Intel\ /* Windows path of directory to examine
*/
, MAXDATE= /* [optional] maximum date/time of file to report
*/
, MINDATE= /* [optional] minimum date/time of file to report*/
, MAXSIZE= /* [optional] maximum size of file to report (MB)
*/
, MINSIZE= /* [optional] minimum size of file to report
(MB) */
, OUT=&outxls. /* [optional] name of output file containing results
of %DIRLISTWIN */
-
8/9/2019 Creating a Directory Listing Using SAS for Windows in TopDown Order
12/12
, REPORT=Y /* [optional] flag controlling report creation
*/ , SUBDIR=Y /* [optional] include subdirectories in directory
processing */
, MAXLEVRPT=5 /* [optional] Max Levels of subdirectories
summarization Required */
) ;
top related