diff --git a/README.md b/README.md index bafcdc0..47668f9 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ SHA256 digest for macroArray: DF63B0E027827A82038F1C8422787A0BC569BA93104BA1778D [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") -- **BasePlus**\[1.16\] adds a bunch of functionalities I am missing in BASE SAS, such as: +- **BasePlus**\[1.17\] adds a bunch of functionalities I am missing in BASE SAS, such as: ```sas call arrMissToRight(myArray); call arrFillMiss(17, myArray); @@ -164,7 +164,7 @@ format x bool.; %zipLibrary(sashelp,libOut=work) ``` -SHA256 digest for BasePlus: 4CD3926B9842925C86B80B5B47B47BEA1FB9707826B545B9B4D52AE97BC3617E +SHA256 digest for BasePlus: 619D4B2562F1D9E42C9C5DCB326E8F4D6A020B5D0CEE29A6174F65F8E1B0E7BD [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") diff --git a/packages/README.md b/packages/README.md index e8fc3c0..b887ebe 100644 --- a/packages/README.md +++ b/packages/README.md @@ -90,7 +90,7 @@ SHA256 digest for macroArray: DF63B0E027827A82038F1C8422787A0BC569BA93104BA1778D --- -- **BasePlus**\[1.16\] adds a bunch of functionalities I am missing in BASE SAS, such as: +- **BasePlus**\[1.17\] adds a bunch of functionalities I am missing in BASE SAS, such as: ```sas call arrMissToRight(myArray); call arrFillMiss(17, myArray); @@ -108,7 +108,7 @@ format x bool.; %zipLibrary(sashelp,libOut=work) ``` -SHA256 digest for BasePlus: 4CD3926B9842925C86B80B5B47B47BEA1FB9707826B545B9B4D52AE97BC3617E +SHA256 digest for BasePlus: 619D4B2562F1D9E42C9C5DCB326E8F4D6A020B5D0CEE29A6174F65F8E1B0E7BD [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 20671bb..be1d187 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,5 +1,8 @@ +/* 20220511 */ +BasePlus: 619D4B2562F1D9E42C9C5DCB326E8F4D6A020B5D0CEE29A6174F65F8E1B0E7BD + /* 20220509 */ -BasePlus:4CD3926B9842925C86B80B5B47B47BEA1FB9707826B545B9B4D52AE97BC3617E +BasePlus: 4CD3926B9842925C86B80B5B47B47BEA1FB9707826B545B9B4D52AE97BC3617E /* 20220508 */ BasePlus: 0331C673052D5221DA98C5CC93295634D8A0BC62C7D2FEF9D0D85B0B2DEDE4E9 diff --git a/packages/baseplus.md b/packages/baseplus.md index 1a8e0f0..2268c5f 100644 --- a/packages/baseplus.md +++ b/packages/baseplus.md @@ -46,6 +46,7 @@ * [`%zipLibrary()` macro](#ziplibrary-macro) * [`%unzipLibrary()` macro](#unziplibrary-macro) * [`%LDSN()` macro](#ldsn-macro) + * [`%LDsNm()` macro](#ldsnm-macro) * [`%LVarNm()` macro](#lvarnm-macro) * [`%LVarNmLab()` macro](#lvarnmlab-macro) @@ -55,7 +56,7 @@ --- -# The BasePlus package [ver. 1.16] ############################################### +# The BasePlus package [ver. 1.17] ############################################### The **BasePlus** package implements useful functions and functionalities I miss in the BASE SAS. @@ -227,52 +228,53 @@ Package contains: 5. macro functionexists 6. macro getvars 7. macro ldsn -8. macro lvarnm -9. macro lvarnmlab -10. macro qdeduplistx -11. macro qgetvars -12. macro qzipevalf -13. macro raincloudplot -14. macro symdelglobal -15. macro unziplibrary -16. macro zipevalf -17. macro ziplibrary -18. format bool -19. format boolz -20. format ceil -21. format floor -22. format int -23. functions arrfill -24. functions arrfillc -25. functions arrmissfill -26. functions arrmissfillc -27. functions arrmisstoleft -28. functions arrmisstoleftc -29. functions arrmisstoright -30. functions arrmisstorightc -31. functions bracketsc -32. functions bracketsn -33. functions catxfc -34. functions catxfi -35. functions catxfj -36. functions catxfn -37. functions deldataset -38. functions semicolonc -39. functions semicolonn -40. format brackets -41. format semicolon -42. proto qsortincbyprocproto -43. functions frommissingtonumberbs -44. functions fromnumbertomissing -45. functions quicksort4notmiss -46. functions quicksorthash -47. functions quicksorthashsddv -48. functions quicksortlight +8. macro ldsnm +9. macro lvarnm +10. macro lvarnmlab +11. macro qdeduplistx +12. macro qgetvars +13. macro qzipevalf +14. macro raincloudplot +15. macro symdelglobal +16. macro unziplibrary +17. macro zipevalf +18. macro ziplibrary +19. format bool +20. format boolz +21. format ceil +22. format floor +23. format int +24. functions arrfill +25. functions arrfillc +26. functions arrmissfill +27. functions arrmissfillc +28. functions arrmisstoleft +29. functions arrmisstoleftc +30. functions arrmisstoright +31. functions arrmisstorightc +32. functions bracketsc +33. functions bracketsn +34. functions catxfc +35. functions catxfi +36. functions catxfj +37. functions catxfn +38. functions deldataset +39. functions semicolonc +40. functions semicolonn +41. format brackets +42. format semicolon +43. proto qsortincbyprocproto +44. functions frommissingtonumberbs +45. functions fromnumbertomissing +46. functions quicksort4notmiss +47. functions quicksorthash +48. functions quicksorthashsddv +49. functions quicksortlight *SAS package generated by generatePackage, version 20220420* The SHA256 hash digest for package BasePlus: -`4CD3926B9842925C86B80B5B47B47BEA1FB9707826B545B9B4D52AE97BC3617E` +`619D4B2562F1D9E42C9C5DCB326E8F4D6A020B5D0CEE29A6174F65F8E1B0E7BD` --- # Content description ############################################################################################ @@ -3521,6 +3523,10 @@ run; The LDSN (Long DataSet Names) macro function allows to use an "arbitrary" text string to name a dataset. +The LDSN macro has some limitation described below, to overcome them +another macro, with different name: LDSNM (Long DataSet Names Modified) +was created. See its description to learn how to use it. + --- The idea for the macro came from the following story: @@ -3607,6 +3613,12 @@ The basic syntax is the following, the `<...>` means optional parameters: ) ~~~~~~~~~~~~~~~~~~~~~~~ +The text string is concider as *"fully qualified dataset name"*, i.e. macro +assumes it may contain library as prefix and data set options as sufix. +See the `%LDsNm()` macro for comparison. + +--- + ### EXAMPLES AND USECASES: #################################################### **EXAMPLE 1.** @@ -3628,6 +3640,163 @@ run; --- +## >>> `%LDSNM()` macro: <<< ####################### + +The LDSNM (Long DataSet Names Modified) macro function +allows to use an "arbitrary" text string to name a dataset. + +The LDSN macro had some limitation (see its documentation), to overcome them +another `%LDSNM()` (Long DataSet Names Modified) macro was created. + +The main idea behind the `%LDSNM()` is the same as for `%LDSN()` - see the description there. + +--- + +The `%LDSNM()` works differently then the `%LDSN()`. + +The `%LDSN()` assumed that *both* libname and dataset options *could* +be passed as elements in macro argument, e.g. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data %LDSN( WORK.peanut butter & jelly with a hot-dog in [a box] and s*t*a*r*s (drop = sex) ); + set sashelp.class; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The `%LDSNM()`, in contrary, assumes that both libname and dataset options are +passed **outside** the macro, i.e. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data WORK.%LDSNM( peanut butter & jelly with a hot-dog in [a box] and s*t*a*r*s ) (drop = sex); + set sashelp.class; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This approach reduces some limitations the LDSN has. + +The **additional** feature of the `%LDSNM()` is that when the macro is called +a global macrovariable, which name is the same as hashed dataset name, is created. +The macrovariable value is the text of the argument of the macro. For example +the following macro call: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data %LDSNM(John "x" 'y' dog); + set sashelp.class; + where name = 'John'; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +creates `DSN_BF1F8C4D6495B34A_` macrovariable with value: `JOHN "X" 'Y' DOG`. + +The macrovariable is useful when combined with `symget()` function and +the `indsname=` option to get the original text string value back, +like in this example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data test; + set %LDSNM(John "x" 'y' dog) indsname = i; + + indsname = symget(scan(i,-1,".")); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +See examples below for the details. + +--- + +The `%LDSN()` macro executes like a pure macro code. + +**Known "Limitations":** + +- dataset name _cannot_ contain _unpaired_ round brackets(`(` and `)`) + (but unmatched `[]` and `{}` are allowed)! + +- dataset name _cannot_ contain _unpaired_ quotes (`'` and `"`), + text: `a "hot-dog"` is ok, but `John's dog` is not! + +**Behaviour:** + +- dataset name text is *converted to upcase* + +- dataset name text *leading and trailing spaces are ignored*, + e.g. the following will give the same hash digest: + `%ldsn(test)`, `%ldsn( test)`, `%ldsn(test )`. + +- macro calls of the form: + `data %LDSN(); run;` or `data %LDSN( ); run;` are resolved + to empty string, so the result is equivalent to `data; run;` + +- created macrovariable is _global_ in scope. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%LDSNM( + arbitrary text string (in line with limitations) +) +~~~~~~~~~~~~~~~~~~~~~~~ + +The text string is concider as *"only dataset name"*, i.e. macro does not +assume it contain library as prefix or data set options as sufix. +See the `%LDSN()` macro for comparison. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data %LDSNM(John "x" 'y' & dog); + set sashelp.class; + where name = 'John'; +run; + +data %LDSNM(John "x"[ 'y' & dog); + set sashelp.class; + where name = 'John'; +run; + +data %LDSNM(John "x" 'y'} & dog); + set sashelp.class; + where name = 'John'; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data work.%LDsNm( peanut butter & jelly, a hot-dog in [a box], and s(*)t(*)a(*)r(*)s!! ) (drop = sex rename=(name=first_name) where = (age in (12,13,14))) +; + set sashelp.class; +run; + +data test; + set work.%LDsNm( peanut butter & jelly, a hot-dog in [a box], and s(*)t(*)a(*)r(*)s!! ) indsname=i; + + indsname=symget(scan(i,-1,".")); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data work.%LDsNm( . ); + set sashelp.class; +run; + +data %LDsNm( ); + set sashelp.class; +run; + + +data %LDsNm(); + set sashelp.class; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + ## >>> `%LVarNm()` macro: <<< ####################### The LVarNm() macro function works like the LDSN() macro function, but for variables. diff --git a/packages/baseplus.zip b/packages/baseplus.zip index 18e626a..cc3b9f9 100644 Binary files a/packages/baseplus.zip and b/packages/baseplus.zip differ