Macro XAMINE (from Fraktal SAS Programming): Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
K |
K |
||
(10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Zazy]] | [[Kategorie:Zazy]] | ||
{{SeitenNavigation1 | {{SeitenNavigation1 | ||
− | |hoch= | + | |hoch=call a macro bubble 0.png |
|links=xx_left.png | |links=xx_left.png | ||
|rechts=xx_right.png | |rechts=xx_right.png | ||
|übersicht=Macro Programming (from Fraktal SAS Programming) | |übersicht=Macro Programming (from Fraktal SAS Programming) | ||
− | |zurück=Macro | + | |zurück=Macro XEDIT (from Fraktal SAS Programming) |
− | |vorwärts=Macro | + | |vorwärts=Macro XSET (from Fraktal SAS Programming) |
}} | }} | ||
− | + | == 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 == | |
− | + | ||
− | + | {| class="wikitable" | |
− | + | ! Code executed | |
− | + | ! Function performed | |
− | + | |- | |
− | + | | | |
− | + | <font face="Courier New"> | |
− | + | ;%MACRO xamine(xpath,etype); | |
− | + | </font> | |
− | + | |Start Macro definition with name and positional parameters xpath and etype | |
− | + | |- | |
− | + | | | |
− | + | <font face="Courier New"> | |
− | + | :%GLOBAL ne ie dir; | |
− | + | </font> | |
− | + | |Declare global macro variables for communication with called macros | |
− | + | |- | |
− | + | | | |
− | + | <font face="Courier New"> | |
− | + | :%LOCAL xpath xentry entry etype; | |
− | + | </font> | |
− | + | |Declare local macro variables | |
− | + | |- | |
− | + | | | |
− | + | <font face="Courier New"> | |
− | + | ;filename entries pipe "dir /b &XPATH." lrecl = 256; | |
− | + | </font> | |
− | + | |Open access path to listing of OS directory content | |
− | + | |- | |
− | + | | | |
− | + | <font face="Courier New"> | |
− | + | ;filename dirs pipe "dir /b /ad &XPATH." lrecl = 256; | |
− | + | </font> | |
− | + | |Open access path to listing of OS directory content of type 'dir' | |
− | + | |- | |
− | + | | | |
− | + | <font face="Courier New"> | |
− | + | ;data entries; | |
− | + | </font> | |
− | + | |Initiate data step to access OS directory content | |
− | + | |- | |
− | + | | | |
− | + | <font face="Courier New"> | |
− | + | :length entry $256; | |
− | + | </font> | |
− | + | |Declare length of data field 'entry' | |
− | + | |- | |
− | + | | | |
− | + | <font face="Courier New"> | |
− | + | :infile entries length = lrecl end = EOF; | |
− | + | </font> | |
− | + | |Set pointer to access path 'entries' | |
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :input entry $varying256. lrecl; | ||
+ | </font> | ||
+ | |Read from 'entries' with variable field length | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :if EOF then call symput('ne',trim(left(put(_N_,8.)))); | ||
+ | </font> | ||
+ | |Write count of entries to macro variable 'ne' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;run; | ||
+ | </font> | ||
+ | |Terminate data step | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;data dirs; | ||
+ | </font> | ||
+ | |Initiate data step to access OS directories listing | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :length dir $256; | ||
+ | </font> | ||
+ | |Declare length of data field 'dir' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :infile dirs length = lrecl end = EOF; | ||
+ | </font> | ||
+ | |Set pointer to access path 'dirs' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :input dir $varying256. lrecl; | ||
+ | </font> | ||
+ | |Read from 'dirs' with variable field length | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;run; | ||
+ | </font> | ||
+ | |Terminate data step | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%DO ie = 1 %TO &NE.; | ||
+ | </font> | ||
+ | |Start macro loop to process entries one by one with loop index 'ie' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;data _NULL_; | ||
+ | </font> | ||
+ | |Initiate data step without creating a dataset | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :set entries(firstobs = &IE. obs = &IE.); | ||
+ | </font> | ||
+ | |Read row number 'ie' from dataset 'entries' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :call symput('entry',compress(translate(entry,'_','(-)'))); | ||
+ | </font> | ||
+ | |Write value from read row to macro variable 'entry' with intermediate name processing | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :call symput('xentry',trim(left(entry))); | ||
+ | </font> | ||
+ | |Write value from read row to macro variable 'xentry' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;run; | ||
+ | </font> | ||
+ | |Terminate data step | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT |; | ||
+ | </font> | ||
+ | |Write string '|' to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT &XPATH.&XENTRY.; | ||
+ | </font> | ||
+ | |Write full path and filename to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%LET dir =; | ||
+ | </font> | ||
+ | |Reset value for macro variable 'dir' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;data _NULL_; | ||
+ | </font> | ||
+ | |Initiate data step without creating a dataset | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | : set dirs(where = (dir = "&XENTRY.")) end = EOF; | ||
+ | </font> | ||
+ | |Read row from dataset 'dirs' with value equal to content of macro variable 'xentry' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :if EOF then call symput('dir',trim(left(put(_N_,8.)))); | ||
+ | </font> | ||
+ | |Write count of read rows to macro variable 'dir' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;run; | ||
+ | </font> | ||
+ | |Terminate data step | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%IF &DIR. = 1 %THEN %DO; | ||
+ | </font> | ||
+ | |Start macro branch to directory processing | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT +----; | ||
+ | </font> | ||
+ | |Write string '+----' to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%XDIR(&XPATH.&XENTRY.); | ||
+ | </font> | ||
+ | |Use macro 'xdir' to write list of directory content to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT +----; | ||
+ | </font> | ||
+ | |Write string '+----' to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%END; | ||
+ | </font> | ||
+ | |End macro branch for directory processing | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%ELSE %DO; | ||
+ | </font> | ||
+ | |Start macro branch for non-directory processing | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%IF %LENGTH(&ETYPE.) ne 0 %THEN %DO; | ||
+ | </font> | ||
+ | |Start macro branch for supplied positional parameter 'etype' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%IF %INDEX(%SCAN(&ETYPE.,2,_),%SCAN(&XENTRY,2,.)) != 0 %THEN %DO; | ||
+ | </font> | ||
+ | |Start macro branch for extension of macro variable 'xentry' is found in 2nd delimited segment of macro variable 'etype' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%GLOBAL windir; | ||
+ | </font> | ||
+ | |Declare macro variable 'windir' to be global | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%XSET(windir); | ||
+ | </font> | ||
+ | |Call macro 'xset' to populate macro variable 'windir' from OS environment variable 'windir' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT +----; | ||
+ | </font> | ||
+ | |Write string '+----' to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT | File &XENTRY. opened in external editor WordPad.; | ||
+ | </font> | ||
+ | |Write string '|' followed by a message to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :SYSTASK command "&WINDIR.\write.exe ""&XPATH.\&XENTRY."""; | ||
+ | </font> | ||
+ | |Call external program 'write.exe' to open currently processed file | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT +----; | ||
+ | </font> | ||
+ | |Write string '+----' to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%END; | ||
+ | </font> | ||
+ | |End macro branch for extension of macro variable 'xentry' is found in 2nd delimited segment of macro variable 'etype' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%IF %INDEX(%SCAN(&ETYPE.,1,_),%SCAN(&XENTRY,2,.)) != 0 %THEN %DO; | ||
+ | </font> | ||
+ | |Start macro branch for extension of macro variable 'xentry' is found in 1st delimited segment of macro variable 'etype' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT +----; | ||
+ | </font> | ||
+ | |Write string '+----' to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT | File &XENTRY. opened in SAS program editor window.; | ||
+ | </font> | ||
+ | |Write string '|' followed by a message to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%XEDIT(&XENTRY.,&XPATH.); | ||
+ | </font> | ||
+ | |Call macro 'xedit' to open currently processed file in SAS DMS Program Editor | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :%PUT +----; | ||
+ | </font> | ||
+ | |Write string '+----' to the LOG | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%END; | ||
+ | </font> | ||
+ | |End macro branch for extension of macro variable 'xentry' is found in 1st delimited segment of macro variable 'etype' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%END; | ||
+ | </font> | ||
+ | |End macro branch for supplied positional parameter 'etype' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%END; | ||
+ | </font> | ||
+ | |End macro branch for non-directory processing | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%END; | ||
+ | </font> | ||
+ | |End macro loop to process entries one by one with loop index 'ie' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;proc sql; | ||
+ | </font> | ||
+ | |Invoke the SAS SQL procedure | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :drop table dirs; | ||
+ | </font> | ||
+ | |Delete table 'dirs' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | :drop table entries; | ||
+ | </font> | ||
+ | |Delete table 'entries' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;quit; | ||
+ | </font> | ||
+ | |Terminate the SAS SQL procedure | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;filename entries clear; | ||
+ | </font> | ||
+ | |Close access path to listing of OS directory content | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;filename dirs clear; | ||
+ | </font> | ||
+ | |Close access path to listing of OS directory content of type 'dir' | ||
+ | |- | ||
+ | | | ||
+ | <font face="Courier New"> | ||
+ | ;%MEND xamine; | ||
+ | </font> | ||
+ | |End Macro definition with name | ||
+ | |} | ||
+ | |||
+ | == Special Effects == | ||
+ | |||
+ | # 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. | ||
+ | # 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. | ||
{{SeitenNavigation1 | {{SeitenNavigation1 | ||
− | |hoch= | + | |hoch=call a macro bubble 0.png |
|links=xx_left.png | |links=xx_left.png | ||
|rechts=xx_right.png | |rechts=xx_right.png | ||
|übersicht=Macro Programming (from Fraktal SAS Programming) | |übersicht=Macro Programming (from Fraktal SAS Programming) | ||
− | |zurück=Macro | + | |zurück=Macro XEDIT (from Fraktal SAS Programming) |
− | |vorwärts=Macro | + | |vorwärts=Macro XSET (from Fraktal SAS Programming) |
}} | }} |
Aktuelle Version vom 6. Januar 2016, 18:39 Uhr
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 |
---|---|
|
Start Macro definition with name and positional parameters xpath and etype |
|
Declare global macro variables for communication with called macros |
|
Declare local macro variables |
|
Open access path to listing of OS directory content |
|
Open access path to listing of OS directory content of type 'dir' |
|
Initiate data step to access OS directory content |
|
Declare length of data field 'entry' |
|
Set pointer to access path 'entries' |
|
Read from 'entries' with variable field length |
|
Write count of entries to macro variable 'ne' |
|
Terminate data step |
|
Initiate data step to access OS directories listing |
|
Declare length of data field 'dir' |
|
Set pointer to access path 'dirs' |
|
Read from 'dirs' with variable field length |
|
Terminate data step |
|
Start macro loop to process entries one by one with loop index 'ie' |
|
Initiate data step without creating a dataset |
|
Read row number 'ie' from dataset 'entries' |
|
Write value from read row to macro variable 'entry' with intermediate name processing |
|
Write value from read row to macro variable 'xentry' |
|
Terminate data step |
|
' to the LOG |
|
Write full path and filename to the LOG |
|
Reset value for macro variable 'dir' |
|
Initiate data step without creating a dataset |
|
Read row from dataset 'dirs' with value equal to content of macro variable 'xentry' |
|
Write count of read rows to macro variable 'dir' |
|
Terminate data step |
|
Start macro branch to directory processing |
|
Write string '+----' to the LOG |
|
Use macro 'xdir' to write list of directory content to the LOG |
|
Write string '+----' to the LOG |
|
End macro branch for directory processing |
|
Start macro branch for non-directory processing |
|
Start macro branch for supplied positional parameter 'etype' |
|
Start macro branch for extension of macro variable 'xentry' is found in 2nd delimited segment of macro variable 'etype' |
|
Declare macro variable 'windir' to be global |
|
Call macro 'xset' to populate macro variable 'windir' from OS environment variable 'windir' |
|
Write string '+----' to the LOG |
|
' followed by a message to the LOG |
|
Call external program 'write.exe' to open currently processed file |
|
Write string '+----' to the LOG |
|
End macro branch for extension of macro variable 'xentry' is found in 2nd delimited segment of macro variable 'etype' |
|
Start macro branch for extension of macro variable 'xentry' is found in 1st delimited segment of macro variable 'etype' |
|
Write string '+----' to the LOG |
|
' followed by a message to the LOG |
|
Call macro 'xedit' to open currently processed file in SAS DMS Program Editor |
|
Write string '+----' to the LOG |
|
End macro branch for extension of macro variable 'xentry' is found in 1st delimited segment of macro variable 'etype' |
|
End macro branch for supplied positional parameter 'etype' |
|
End macro branch for non-directory processing |
|
End macro loop to process entries one by one with loop index 'ie' |
|
Invoke the SAS SQL procedure |
|
Delete table 'dirs' |
|
Delete table 'entries' |
|
Terminate the SAS SQL procedure |
|
Close access path to listing of OS directory content |
|
Close access path to listing of OS directory content of type 'dir' |
|
End Macro definition with name |
Special Effects
- 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.
- 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.