Macro XAMINE (from Fraktal SAS Programming)

Aus phenixxenia.org
Zur Navigation springen Zur Suche springen

Zurück

Übersicht

Vorwärts

What it does

This multilevel structured macro combines the simpler ones from above to perform adapted processing of entries from a specified path 'XPATH'. Behavior depends on filter arguments supplied by a segmented parameter 'ETYPE'.

  • Segments are limited hardcoded with an underscore ('_').
    • 1st segment arguments are processed as SAS program code and copied into the SAS DMS Program Editor.
    • 2nd segment arguments are processed as Text and passed to the Wordpad text processor from the MS-Windows accessories collection.

Annotated Code

Code executed Function performed

%MACRO xamine(xpath,etype);

Start Macro definition with name and positional parameters xpath and etype

%GLOBAL ne ie dir;

Declare global macro variables for communication with called macros

%LOCAL xpath xentry entry etype;

Declare local macro variables

filename entries pipe "dir /b &XPATH." lrecl = 256;

Open access path to listing of OS directory content

filename dirs pipe "dir /b /ad &XPATH." lrecl = 256;

Open access path to listing of OS directory content of type 'dir'

data entries;

Initiate data step to access OS directory content

length entry $256;

Declare length of data field 'entry'

infile entries length = lrecl end = EOF;

Set pointer to access path 'entries'

input entry $varying256. lrecl;

Read from 'entries' with variable field length

if EOF then call symput('ne',trim(left(put(_N_,8.))));

Write count of entries to macro variable 'ne'

run;

Terminate data step

data dirs;

Initiate data step to access OS directories listing

length dir $256;

Declare length of data field 'dir'

infile dirs length = lrecl end = EOF;

Set pointer to access path 'dirs'

input dir $varying256. lrecl;

Read from 'dirs' with variable field length

run;

Terminate data step

%DO ie = 1 %TO &NE.;

Start macro loop to process entries one by one with loop index 'ie'

data _NULL_;

Initiate data step without creating a dataset

set entries(firstobs = &IE. obs = &IE.);

Read row number 'ie' from dataset 'entries'

call symput('entry',compress(translate(entry,'_','(-)')));

Write value from read row to macro variable 'entry' with intermediate name processing

call symput('xentry',trim(left(entry)));

Write value from read row to macro variable 'xentry'

run;

Terminate data step

%PUT |;

' to the LOG

%PUT &XPATH.&XENTRY.;

Write full path and filename to the LOG

%LET dir =;

Reset value for macro variable 'dir'

data _NULL_;

Initiate data step without creating a dataset

set dirs(where = (dir = "&XENTRY.")) end = EOF;

Read row from dataset 'dirs' with value equal to content of macro variable 'xentry'

if EOF then call symput('dir',trim(left(put(_N_,8.))));

Write count of read rows to macro variable 'dir'

run;

Terminate data step

%IF &DIR. = 1 %THEN %DO;

Start macro branch to directory processing

%PUT +----;

Write string '+----' to the LOG

%XDIR(&XPATH.&XENTRY.);

Use macro 'xdir' to write list of directory content to the LOG

%PUT +----;

Write string '+----' to the LOG

%END;

End macro branch for directory processing

%ELSE %DO;

Start macro branch for non-directory processing

%IF %LENGTH(&ETYPE.) ne 0 %THEN %DO;

Start macro branch for supplied positional parameter 'etype'

%IF %INDEX(%SCAN(&ETYPE.,2,_),%SCAN(&XENTRY,2,.)) != 0 %THEN %DO;

Start macro branch for extension of macro variable 'xentry' is found in 2nd delimited segment of macro variable 'etype'

%GLOBAL windir;

Declare macro variable 'windir' to be global

%XSET(windir);

Call macro 'xset' to populate macro variable 'windir' from OS environment variable 'windir'

%PUT +----;

Write string '+----' to the LOG

%PUT | File &XENTRY. opened in external editor WordPad.;

' followed by a message to the LOG

SYSTASK command "&WINDIR.\write.exe ""&XPATH.\&XENTRY.""";

Call external program 'write.exe' to open currently processed file

%PUT +----;

Write string '+----' to the LOG

%END;

End macro branch for extension of macro variable 'xentry' is found in 2nd delimited segment of macro variable 'etype'

%IF %INDEX(%SCAN(&ETYPE.,1,_),%SCAN(&XENTRY,2,.)) != 0 %THEN %DO;

Start macro branch for extension of macro variable 'xentry' is found in 1st delimited segment of macro variable 'etype'

%PUT +----;

Write string '+----' to the LOG

%PUT | File &XENTRY. opened in SAS program editor window.;

' followed by a message to the LOG

%XEDIT(&XENTRY.,&XPATH.);

Call macro 'xedit' to open currently processed file in SAS DMS Program Editor

%PUT +----;

Write string '+----' to the LOG

%END;

End macro branch for extension of macro variable 'xentry' is found in 1st delimited segment of macro variable 'etype'

%END;

End macro branch for supplied positional parameter 'etype'

%END;

End macro branch for non-directory processing

%END;

End macro loop to process entries one by one with loop index 'ie'

proc sql;

Invoke the SAS SQL procedure

drop table dirs;

Delete table 'dirs'

drop table entries;

Delete table 'entries'

quit;

Terminate the SAS SQL procedure

filename entries clear;

Close access path to listing of OS directory content

filename dirs clear;

Close access path to listing of OS directory content of type 'dir'

%MEND xamine;

End Macro definition with name

Special Effects

  1. The macro makes use of the 'pipe' type file reference. When used appropriately, this returns a list that is instantly generated by an OS command that is given as the statement's argument.
  2. As an alternate text processing instance the macro uses a SYSTASK statement to call the windows component 'Wordpad'. Since each paticular windows installation uses its own path structure, the macro makes use of the 'windir' environment variable.

Zurück

Übersicht

Vorwärts