From 1cbc5de18f462611d0930a4708c50e1ce75d090d Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Tue, 7 Nov 2023 12:53:30 +0100 Subject: [PATCH] The BasePlus package [ver. 1.33.0] ## The BasePlus package [ver. 1.33.0] - New macro [`%unzipArch()`](https://github.com/SASPAC/baseplus/blob/main/baseplus.md#unziparch-macro) added. The macro allows to extract ZIP archive file from SAS session and does not need `XCMD` (is OS independent). - Documentation updated. --- SHA256 digest for the latest version of `BasePlus`: F*6214654B4575DC8E4BA3CF032924862C2F69A03A6384872BAA9F774EDF6A8DDA --- README.md | 2 +- baseplus.md | 238 +- baseplus.zip | Bin 289151 -> 291735 bytes hist/1.33.0/baseplus.md | 6020 ++++++++++++++++++++++++++++++++++++++ hist/1.33.0/baseplus.zip | Bin 0 -> 291735 bytes 5 files changed, 6184 insertions(+), 76 deletions(-) create mode 100644 hist/1.33.0/baseplus.md create mode 100644 hist/1.33.0/baseplus.zip diff --git a/README.md b/README.md index b89ef2e..9b405be 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ libname NEW "%workPath()/new"; ``` and more. -SHA256 digest for the latest version of `BasePlus`: F*3407AD8068C7528E129034144F9A44CFDF14B7DC34334C64C2F1D67351D1E01E +SHA256 digest for the latest version of `BasePlus`: F*6214654B4575DC8E4BA3CF032924862C2F69A03A6384872BAA9F774EDF6A8DDA [**Documentation for BasePlus**](./baseplus.md "Documentation for BasePlus") diff --git a/baseplus.md b/baseplus.md index 032496c..34851dd 100644 --- a/baseplus.md +++ b/baseplus.md @@ -45,6 +45,7 @@ * [`%RainCloudPlot()` macro](#raincloudplot-macro) * [`%zipLibrary()` macro](#ziplibrary-macro) * [`%unzipLibrary()` macro](#unziplibrary-macro) + * [`%unzipArch()` macro](#unzipatch-macro) * [`%LDSN()` macro](#ldsn-macro) * [`%LDsNm()` macro](#ldsnm-macro) * [`%LVarNm()` macro](#lvarnm-macro) @@ -78,7 +79,7 @@ --- -# The BasePlus package [ver. 1.32.0] ############################################### +# The BasePlus package [ver. 1.33.0] ############################################### The **BasePlus** package implements useful functions and functionalities I miss in the BASE SAS. @@ -357,78 +358,79 @@ run; --- Package contains: -1. macro bppipe -2. macro deduplistc -3. macro deduplistp -4. macro deduplists -5. macro deduplistx -6. macro dirsandfiles -7. macro functionexists -8. macro getvars -9. macro intslist -10. macro ldsn -11. macro ldsnm -12. macro lvarnm -13. macro lvarnmlab -14. macro qdeduplistx -15. macro qgetvars -16. macro qzipevalf -17. macro raincloudplot -18. macro repeattxt -19. macro splitdsintoblocks -20. macro splitdsintoparts -21. macro symdelglobal -22. macro unziplibrary -23. macro zipevalf -24. macro ziplibrary -25. format bool -26. format boolz -27. format ceil -28. format floor -29. format int -30. function arrfill -31. function arrfillc -32. function arrmissfill -33. function arrmissfillc -34. function arrmisstoleft -35. function arrmisstoleftc -36. function arrmisstoright -37. function arrmisstorightc -38. function bracketsc -39. function bracketsn -40. function catxfc -41. function catxfi -42. function catxfj -43. function catxfn -44. function deldataset -45. function semicolonc -46. function semicolonn -47. format brackets -48. format semicolon -49. proto qsortincbyprocproto -50. function frommissingtonumberbs -51. function fromnumbertomissing -52. function quicksort4notmiss -53. function quicksorthash -54. function quicksorthashsddv -55. function quicksortlight -56. macro date -57. macro datetime -58. macro filepath -59. macro finddswithvarval -60. macro fmt -61. macro gettitle -62. macro infmt -63. macro letters -64. macro libpath -65. macro minclude -66. macro monthshift -67. macro replist -68. macro time -69. macro today -70. macro translate -71. macro tranwrd -72. macro workpath +1. macro bppipe +2. macro deduplistc +3. macro deduplistp +4. macro deduplists +5. macro deduplistx +6. macro dirsandfiles +7. macro functionexists +8. macro getvars +9. macro intslist +10. macro ldsn +11. macro ldsnm +12. macro lvarnm +13. macro lvarnmlab +14. macro qdeduplistx +15. macro qgetvars +16. macro qzipevalf +17. macro raincloudplot +18. macro repeattxt +19. macro splitdsintoblocks +20. macro splitdsintoparts +21. macro symdelglobal +22. macro unziparch +23. macro unziplibrary +24. macro zipevalf +25. macro ziplibrary +26. format bool +27. format boolz +28. format ceil +29. format floor +30. format int +31. function arrfill +32. function arrfillc +33. function arrmissfill +34. function arrmissfillc +35. function arrmisstoleft +36. function arrmisstoleftc +37. function arrmisstoright +38. function arrmisstorightc +39. function bracketsc +40. function bracketsn +41. function catxfc +42. function catxfi +43. function catxfj +44. function catxfn +45. function deldataset +46. function semicolonc +47. function semicolonn +48. format brackets +49. format semicolon +50. proto qsortincbyprocproto +51. function frommissingtonumberbs +52. function fromnumbertomissing +53. function quicksort4notmiss +54. function quicksorthash +55. function quicksorthashsddv +56. function quicksortlight +57. macro date +58. macro datetime +59. macro filepath +60. macro finddswithvarval +61. macro fmt +62. macro gettitle +63. macro infmt +64. macro letters +65. macro libpath +66. macro minclude +67. macro monthshift +68. macro replist +69. macro time +70. macro today +71. macro translate +72. macro tranwrd +73. macro workpath @@ -436,10 +438,10 @@ Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load or look for the baseplus_AdditionalContent directory in the Packages fileref localization (only if additional content was deployed during the installation process). -* SAS package generated by generatePackage, version 20231024 * +* SAS package generated by generatePackage, version 20231107 * The SHA256 hash digest for package BasePlus: -`F*3407AD8068C7528E129034144F9A44CFDF14B7DC34334C64C2F1D67351D1E01E` +`F*6214654B4575DC8E4BA3CF032924862C2F69A03A6384872BAA9F774EDF6A8DDA` --- # Content description ############################################################################################ @@ -3771,6 +3773,92 @@ run; --- +## >>> `%unzipArch()` macro: <<< ####################### + +The unzipArch() macro allows to unzip content of a ZIP archive. +Macro is OS independent, the `XCMD` option is not required. + +The `dlCreateDir` option is used under the hood. + +Content of unzipped archive can be listed in the log. + +Source files can be deleted after decompression. +Errors of decompression and are reported. If any occur +the deletion is suspended. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%unzipArch( + archName + <,path=> + <,target=> + <,list=> + <,clean=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `archName` - *Required*, name of the ZIP archive to be extracted. + Name should be full, i.e., with the extension. + +* `path=` - *Optional*, a path pointing to zipped file location. + The path should be provided unquoted. + Default value is `WORK` location. + +* `target=` - *Optional*, a path pointing to target location where + files will be extracted. + The path should be provided unquoted. + Default value is `WORK` location. + +* `list = 0` - *Optional*, default value is `0`, + indicates if zip content should be listed in the log. + `1` means *yes*, `0` means *no*. + +* `clean = 0` - *Optional*, default value is `0`, + indicates if zip file should be deleted after unzipping. + `1` means *yes*, `0` means *no*. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Unzip compressed archive. Example requires the `basePlus` package. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + +filename arch ZIP "%workPath()/testArch.zip"; + +data _null_; + file arch(abc/test1.txt); + put "text for test file 1"; +data _null_; + file arch(abc/subdir/test2.txt); + put "text for test file 2"; +data _null_; + file arch(abc/subdir/test3.txt); + put "text for test file 3"; +run; + +%unzipArch( + testArch.zip +, path = %workPath() +, target = %workPath() +, list=1 +); + +%unzipArch( + testArch.zip +, path = %workPath() +, target = %workPath() +, clean=1 +); + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ## >>> `%LDSN()` macro: <<< ####################### The LDSN (Long DataSet Names) macro function diff --git a/baseplus.zip b/baseplus.zip index 58e20c883c56c0a8da57bd4bb8302f4c6043dfb1..3c69e88c488104dbabfb317b203e746452a6802f 100644 GIT binary patch delta 17891 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

7f>TvJdP&aH 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

_jnjykVsu@$;l_}56@ZRWLz!&-@hNVy= z+bC-u)@VSROIb7(bp^P1Q&eChP$ry%incWJ@Zf73?A!t3D7QMlFmH=sOnHPsc~&g~`P+s~gzK(CmN=I?G}B!AuRX zwv0M{xNmtBN)(;*>c5(KX*&4Fm0t>P_j)0eM)Ewf_BB@?$K2O$Otx_Gc48ZI9yBMq z52JO_S&8v~WflZlSQEFC5mEp3>5a7x@I5ZBGcrUJ_Woze!z@*aP1GrKpz5jfD#M4E z4>)L+uR4C8{aPM5_}S}nF_0^aHw`Xc-2RdID$D=+5Z!n&-%!7NRWrit6xBI!6fD6N z&6y=el;_(ZVJ&-8{)~c`g0l;$i9ceG9+_(1Zv*XXwIUfkt)cgq;!;R)D6bgB)U%_b zcm=h3U!(xjiC5^8=EFU$${MX-q!^6*QxgtcFZXcD1m3-fygj`OF(C&F3*3Q2Cu$9v z?LqduqV7ARVWRGB&a&iRm3<2gaqIz(a$9df0;mYzeY+-HiWkd6tQ>6u@9*Z`JH30+ zG|BmqE(*ToGqJuB4?#RySQd->dEK)qbp$=tVU0t}yKJc=UY&&(eMw*uf3ebV-r1>S ziyQqfOhG!ecquViuW{IvZK`+lWvk05g2{QvE6d!Z3r$(%ZZ+sS=Dq08&G2f)8~cegmr-wJ2|0IFijF&8UR zY*7?-0#nqfVG12L2Us6-vOi1n^vCi*%iLT(77}c_@xjsIQ4;#@iTDml zNx_!Sr+&#bZe+O@#{I1bVYd5mMaQS9_ zcV>sSkrIG=3?Y&xyv>(YJNbcpEIIZn$MJ~up?%X|oT(krR#uXCWCy8pj!3QDqE2S( zLUfAx1t+@>n}z>)xe0dabRhOK`e-gj7g@{);XVb-82l1Bfk8y<9H!~}Y`RUiNm$BTI%K{@tt0PN5H~kz`w*!LLZC@hDl5Fb{yKE;G zM@-h3u!j+cCdq%)Y!my;?+bV6-KVgA=_^_NahXR(a>eGGs}5@!dc~nHt&f?!a?y8r z7e_>&DzX28P&hFx%5PBEhB?zPBSKb`8*9&?q*M*q<$@1R-x##ANP2VZd>J}X^dU%- zds^U!k@0H#&CSl#@<<<2Q?^l-7vQT3q~N%F94Aw-nVv~=TN07<-6%$N!{oPu8KU}F zvBd9Lc0hckKWckLJW-t1+sX-J>Up(O)VyV%PaR7iUNI}3m88ylu3s?p);Pk| z&3OEv8S}Y*8uyKgeE82cR)=4U`91jY3vLOt_5xOYU=h)-+}oXSF5~%whUp#;Dw8V( z0$o%GPea9LdsYjYGV=!l@FK&0@aVBeUGq1kjbH~)Go;kdwwBCsBR@lDdW+Y;v$uOm z8Lu47$be*BHIF3ld4!_O+$73Tx+d2vC)em_{m!8l5 z+#^=EP1}~xX_yOR!EmcIT;<)$R+;2y(!s$iCMIiPt5pcZcec*pR^s9Cun??>WCBLwg?i`<{=) z226${z;5K7sXC0p8!PDF=l#m0Se+GR2Uq`$GtRfQd*u9QcBbxkeazpYH>4IA)nvbQ z^k1uvl$|+LdL2%;(sz;4bs>ha+MA@T^J{3^nZ&LG(7$6X-xcqCBEZ|wX3DtKbMyE% zYcWFlt}AIHNCcFYwm#kb#b9ASJ9D{VV+G7rH&i?Cb#d79c0pBtPnNkHy_&18QSHii zZ~udpb?5p+nUy}A0Oj&tXUykzvNbLkDU>0bRFY(OtgL6Jl(EJy2VY*_x6tpGbm)M)nO-08U=T?6I+2?~xkMpp+8n`Sa*AMU z%eLxw9$jk-GPni!a_iU$!)34OR*hx-K6099BD2%;8FkTkV z3JD2`7tSY5TpU^yro7UJJLtdT9P5Y2SC@?478u=)#W7G@zb7Sd$G3J3NL~>Pr{0t` zXze5x-8jj|;5(|MYn&^jpPa3sH1q?@%j&+a$*VAzRP2<^%arWI!%DBnXEaPG^aI>o zZmxpSi@g1`SWMgQDZF!4o#zi1hikvkk$i6|8H|;@`+xR>vw?lQa0M%(3uDa8mvu7ThQ!U-Z z;56GC#^wrl8spE~|? zTjWpcs}66~+EI_i4uGBx{*yuo7;$D^b92_Aaq!}KrY&!N+-JW*Y=}%tkhRuq55S<{ z!C}DK>yA>RjabH~oY?moNu=Bb517f|<;oP1X73&spsMbzD@W9EzMtvJalg_eytjye z1Q$z6lmN6-YjtRR2cp|v!?;yD;fk57;lp+0|2YD z$YX9lns9O!x4qwM1Kwa`39G{*E#F`xy9!`V>KvF`(hJ*}uh(>%zF{^5Kh&^4m}lLc z$ybV(5=&}-i=KgLA+AabL}ziD%im~|j2NUaDXf@JJ7$}!(Liq28O+?>npiJYH2G-1 zCF2=ZI9{Ws!zeCOSgx%=s=D+1l(^&U+@~BB2H#mfm%G1QJBn9B5w_6tz1H5Wok_{% zjFxl~;K7bQg}@eXABH*{y!`S_K*hNm>pk;!&LIF*)y-Qukblgu&^y*(I5h*tTm2PW z$CX+g5u$l~OndfD-t)u&5oT9Tm=Ot1k%Pg|dJUF&ru;VIpFEvq^Yt2er$#Y@_3B&N zJl>h5y>Zws2eq8)$@b3{Joj3){Y_-dV&G5L8Y`3V)3{Ill;W}_z=gUq`m4jj^Q@#8 zX+)l97UsA~MU;$M(w`Wm#Z81=gar#o@6DxuHAm#Fx~kN?aCNp5Yi<5g;36g17?6_Aa7tO+wQ8&Q~PCY)DX?Zs^23|64|tTK2UAX?5L#@X3@`7 zk{ZLv81@ObTn+21@{9(%#;1=>c3ULwpY${|qM*Sg_UdUz72O;u80+*=SFqI^ z?i@|}R?RQBXR~d!K^%=Ftk}6|V1`P$4H%YBL}b+ujK;=-zGkvIZly`F4-^!m#N7=u zN;0v~<;UL%_6i+2Ojo~+65KwC<=;6e!0jKvX+p!EIrb`R-O}ndQ!F^4r_u0C&D8}d z7GTk6=%l_f;8(T;6eoL{zGy+T$(C`>uK7xXk^e&Ebc;z-M@w{ei{DVFm!FNQfFo?< z$`PV_9^3Je7`&n7!}7~_@4LLb5^+H}z08tx#vtGYjleOC2_!xFXO+nNwNJ3k;n`m?VMQk`j!jrx=e?h6c0?MLx0hm}Z(djVgFWzFhd6X_TT$R{7B3^cuA#oaw+& zfBel6$-?w6ce~fdn(0l|`^Fc#GpcCz?tl3lspyzVOAFyt+} zceT5*I+}@ZM;Xs$1u$a}LY(bmxHc@h_D<#G6PCA@@{z{Tt~E5Vu?`b31J%gS!L zE6V0wySlY6v~RN4+^f1mmcCc2r@q3uZ&X6`zUNx+gBN%$3|08}JH*i>y}>bLFj0ed zOJ~agY^0Chn6ZM08v4;tGWPhe^BoUM6M5KCO!L)D91js14?gd13E3H2y5)zHkofYN zk3*(iIp@p|p|)SoH@sd>|1vmiY)UhGnXq!g@ZPrMRK-@z2z!gHG>D=q*?1Yf-~BWP zgKQ6<^yBkhC2MVo;#=(|o@c0Egg=cO;^F@Z6RI(c;iy35)Q{^VkM7hD-}nJ+$k}e_)+)5^>eV~{GxY6pbjUK&W;0FW zw?O&V5;+az%8j}5_5qZX12bjc-9?;&FD ze*SX#?{C(1$`XvA$HVa6GV`Fv1Kxsp{(w{v004)cvZndG&RenZ34eL_Vp$i8m!Ll4 zda6E8f-{=J@Q)gB44BaV5c!hUPdzgB*cgw1fzK0%aUj9d$@@1^Q3#JRprqQTt|o}@ zlMvr~u_wg)1N;*a{4xBA8Ks($_)&^~_yyb}5jBzX)Wx*W_=Ie)9KqB7Ij3$|7$7H! z1OQ}_0RRL59KcIGm&*Q(VX=0}})m4WM@8|M~@Fe0R`0zAE8&syphg*p~b-pntCtgPHzI{Ww_54BGV zNr_AueC@pezY0L5qoZ@)klb?2Fy9Kt*fQKaw>ZfDdh-hR$ct- zjL`9$)M|QQJ3RjV?=G})@=iXh{5Vw&DokgQ2=dc~^z|HiLW$raNY0p;F>{bpN}wDy z&I#z%FCMg4JB!adCNaj$cW4hNBZt10n2J&!>odoRfSoJdM^X5(SMho{rPrFU$_YY) z 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 delta 15349 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 CLX*q@ diff --git a/hist/1.33.0/baseplus.md b/hist/1.33.0/baseplus.md new file mode 100644 index 0000000..34851dd --- /dev/null +++ b/hist/1.33.0/baseplus.md @@ -0,0 +1,6020 @@ +- [The BasePlus package](#baseplus-package) +- [Content description](#content-description) + * [`%getVars()` macro](#getvars-macro) + * [`%QgetVars()` macro](#qgetvars-macro) + * [`%symdelGlobal()` macro](#symdelglobal-macro) + * [`bool.` format](#bool-format) + * [`boolz.` format](#boolz-format) + * [`ceil.` format](#ceil-format) + * [`floor.` format](#floor-format) + * [`int.` format](#int-format) + * [`arrFill()` subroutine](#arrfill-subroutine) + * [`arrFillC()` subroutine](#arrfillc-subroutine) + * [`arrMissFill()` subroutine](#arrmissfill-subroutine) + * [`arrMissFillC()` subroutine](#arrmissfillc-subroutine) + * [`arrMissToLeft()` subroutine](#arrmisstoleft-subroutine) + * [`arrMissToLeftC()` subroutine](#arrmisstoleftc-subroutine) + * [`arrMissToRight()` subroutine](#arrmisstoright-subroutine) + * [`arrMissToRightC()` subroutine](#arrmisstorightc-subroutine) + * [`catXFc()` function](#catxfc-function) + * [`catXFi()` function](#catxfi-function) + * [`catXFj()` function](#catxfj-function) + * [`catXFn()` function](#catxfn-function) + * [`delDataset()` function](#deldataset-function) + * [`qsortInCbyProcProto()` proto function](#qsortincbyprocproto-proto-function) + * [`fromMissingToNumberBS()` function](#frommissingtonumberbs-function) + * [`fromNumberToMissing()` function](#fromnumbertomissing-function) + * [`quickSort4NotMiss()` subroutine](#quicksort4notmiss-subroutine) + * [`quickSortHash()` subroutine](#quicksorthash-subroutine) + * [`quickSortHashSDDV()` subroutine](#quicksorthashsddv-subroutine) + * [`quickSortLight()` subroutine](#quicksortlight-subroutine) + * [`%dedupListS()` macro](#deduplists-macro) + * [`%dedupListC()` macro](#deduplistc-macro) + * [`%dedupListP()` macro](#deduplistp-macro) + * [`%dedupListX()` macro](#deduplistx-macro) + * [`%QdedupListX()` macro](#qdeduplistx-macro) + * [`brackets.` format](#brackets-format) + * [`semicolon.` format](#semicolon-format) + * [`bracketsC()` function](#bracketsc-function) + * [`bracketsN()` function](#bracketsn-function) + * [`semicolonC()` function](#semicolonc-function) + * [`semicolonN()` function](#semicolonn-function) + * [`%zipEvalf()` macro](#zipevalf-macro) + * [`%QzipEvalf()` macro](#qzipevalf-macro) + * [`%functionExists()` macro](#functionexists-macro) + * [`%RainCloudPlot()` macro](#raincloudplot-macro) + * [`%zipLibrary()` macro](#ziplibrary-macro) + * [`%unzipLibrary()` macro](#unziplibrary-macro) + * [`%unzipArch()` macro](#unzipatch-macro) + * [`%LDSN()` macro](#ldsn-macro) + * [`%LDsNm()` macro](#ldsnm-macro) + * [`%LVarNm()` macro](#lvarnm-macro) + * [`%LVarNmLab()` macro](#lvarnmlab-macro) + * [`%bpPIPE()` macro](#bppipe-macro) + * [`%dirsAndFiles()` macro](#dirsandfiles-macro) + * [`%repeatTxt()` macro](#repeattxt-macro) + * [`%repList()` macro](#replist-macro) + * [`%intsList()` macro](#intslist-macro) + * [`%letters()` macro](#letters-macro) + * [`%splitDSIntoBlocks()` macro](#splitdsintoblocks-macro) + * [`%splitDSIntoParts()` macro](#splitdsintoparts-macro) + * [`%filePath()` macro](#filepath-macro) + * [`%libPath()` macro](#libpath-macro) + * [`%workPath()` macro](#workpath-macro) + * [`%date()` macro](#date-macro) + * [`%today()` macro](#today-macro) + * [`%time()` macro](#time-macro) + * [`%datetime()` macro](#datetime-macro) + * [`%monthShift()` macro](#monthshift-macro) + * [`%translate()` macro](#translate-macro) + * [`%tranwrd()` macro](#tranwrd-macro) + * [`%findDSwithVarVal()` macro](#finddswithvarval-macro) + * [`%getTitle()` macro](#gettitle-macro) + * [`%mInclude()` macro](#minclude-macro) + * [`%fmt()` macro](#fmt-macro) + * [`%infmt()` macro](#infmt-macro) + + + * [License](#license) + +--- + +# The BasePlus package [ver. 1.33.0] ############################################### + +The **BasePlus** package implements useful +functions and functionalities I miss in the BASE SAS. + +It is inspired by various people, e.g. +- at the SAS-L discussion list +- at the communities.sas.com (SASware Ballot Ideas) +- at StackOverflow +- at the Office... +- etc. + +Kudos to all who inspired me to generate this package: +*Mark Keintz*, +*Paul Dorfman*, +*Richard DeVenezia*, +*Christian Graffeuille*, +*Allan Bowe*, +*Anamaria Calai*, +*Michal Ludwicki*, +*Quentin McMullen*, +*Kurt Bremser*, +*Leonid Batkhan*. + +--- + +### BASIC EXAMPLES AND USECASES: #################################################### + +**Example 1**: One-dimensional array functions. + Array parameters to subroutine + calls must be 1-based. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data _null_; + array X[4] _temporary_ (. 1 . 2); + + call arrMissToRight(X); + do i = 1 to 4; + put X[i]= @; + end; + put; + + call arrFillMiss(17, X); + do i = 1 to 4; + put X[i]= @; + end; + put; + + call arrFill(42, X); + do i = 1 to 4; + put X[i]= @; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 2**: Delete dataset by name. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data toDrop; + x = 17; + run; + data _null_; + p = delDataset("toDrop"); + put p=; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 3**: Strings concatenation with format. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data test; + x = 1 ; y = . ; z = 3 ; + t = "t"; u = " "; v = "v"; + + array a[*] x y z; + array b[*] t u v; + + length s1 s2 s3 s4 $ 17; + s1 = catXFn("z5.", "#", A); + s2 = catXFi("z5.", "#", A); + s3 = catXFc("upcase.", "*", B); + s4 = catXFj("upcase.", "*", B); + + put (_all_) (=); + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 4**: Useful formats. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data _null_; + input x @@; + put @1 x= @11 x= bool. @21 x= int. @31 x= ceil. @41 x= floor.; + cards; + . ._ .A -10 -3.14 0 3.14 10 + ; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 5**: Getting variables names from datasets. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class + ,pattern = ght$ + ,sep = + + ,varRange = _numeric_)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 6**: Quick sort as an alternative to call sortn() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data _null_; + array test[25000000] _temporary_ ; + + t = time(); + call streaminit(123); + do _N_ = 25000000 to 1 by -1; + test[_N_] = rand("uniform"); + end; + t = time() - t; + put "Array population time: " t; + + t = time(); + call quickSortLight (test); + t = time()-t; + put "Sorting time: " / t=; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 7**: De-duplicate values from a space separated list. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let list = 4 5 6 1 2 3 1 2 3 4 5 6; + %put *%dedupListS(&list.)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 8**: Zip elements of two space separated list. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%let x = %zipEvalf(1 2 3 4 5 6, 2018 2019 2020, argMd=5, function=MDY, format=date11.); +%put &=x; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 9**: Simple Rain Cloud plot. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%rainCloudPlot(sashelp.cars,DriveTrain,Invoice) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 10**: Zip SAS library. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%zipLibrary(sashelp, libOut=work) + +%unzipLibrary(%sysfunc(pathname(work)), zip=sashelp, mode=S, clean=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 11**: Long dataset names. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data %LDSN( work. peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s (drop = sex rename=(name=first_name) where = (age in (12,13,14))) ); + set sashelp.class; +run; + +proc print data = %LDSN( work. peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s ); +run; + +data MyNextDataset; + set %LDSN( work. peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s ); + where age > 12; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 12**: List, to the log, content of `home` directory. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%bpPIPE(ls -la ~/) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 13** Get list of all files and directories from `C:\SAS_WORK\`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(C:\SAS_WORK\,ODS=work.result) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 14** Text repetition: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 15** Integer list: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %intsList(42); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 16** Split dataset into blocks of 5 observations: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%splitDSIntoBlocks(5, sashelp.class, classBlock) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 17** Split dataset into 7 parts: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%splitDSIntoParts(7, sashelp.cars, carsPart) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 18** Return path to temporary file: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + filename f temp; + %put %filePath(f); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 19** Get titles: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + title1 j=c "Hi Roger" ; + title2 j=l "Good Morning" ; + title3 "How are you?" ; + title4 ; + title5 "Bye bye!" ; + + %put %GetTitle(1 2 3 5, dlm=s, qt='') ; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 20** Format and informat macro variables values: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %fmt(12345, date9.) %fmt(12345, yymmdd10.); + + %put %infmt($111234, dollar10.2); + %put %infmt($111.234, dollar10.2); + + %let text = ##%fmt(ABC, $char9., -C)##; + %put &text.; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 21** "Macro including" a text file: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + filename f "%workpath()/testFile1.txt"; + data _null_; + file f; + put "13 14 15"; + run; + + data testDataset; + set sashelp.class; + where age in ( %mInclude(f) ); + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 22** Repeating texts and lists: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +options mprint; + +data work.A; + x=17; +data work.B; + x=42; +data work.C; + x=303; +run; + +data work.test5; + set + %repeatTxt(work.A work.B work.C, 5) + ; +run; + + +data Times2_A3B4C5; + set + %repList(work.A work.B work.C, times = 2, each = 3 4 5) + ; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 23** Date and time one-liners: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %today() %date() %time() %datetime(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 24** Months shifting: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put + Past: %monthShift(2023, 1, -1) + Current: %monthShift(2023, 1 ) + Future: %monthShift(2023, 1, +1) +; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +Package contains: +1. macro bppipe +2. macro deduplistc +3. macro deduplistp +4. macro deduplists +5. macro deduplistx +6. macro dirsandfiles +7. macro functionexists +8. macro getvars +9. macro intslist +10. macro ldsn +11. macro ldsnm +12. macro lvarnm +13. macro lvarnmlab +14. macro qdeduplistx +15. macro qgetvars +16. macro qzipevalf +17. macro raincloudplot +18. macro repeattxt +19. macro splitdsintoblocks +20. macro splitdsintoparts +21. macro symdelglobal +22. macro unziparch +23. macro unziplibrary +24. macro zipevalf +25. macro ziplibrary +26. format bool +27. format boolz +28. format ceil +29. format floor +30. format int +31. function arrfill +32. function arrfillc +33. function arrmissfill +34. function arrmissfillc +35. function arrmisstoleft +36. function arrmisstoleftc +37. function arrmisstoright +38. function arrmisstorightc +39. function bracketsc +40. function bracketsn +41. function catxfc +42. function catxfi +43. function catxfj +44. function catxfn +45. function deldataset +46. function semicolonc +47. function semicolonn +48. format brackets +49. format semicolon +50. proto qsortincbyprocproto +51. function frommissingtonumberbs +52. function fromnumbertomissing +53. function quicksort4notmiss +54. function quicksorthash +55. function quicksorthashsddv +56. function quicksortlight +57. macro date +58. macro datetime +59. macro filepath +60. macro finddswithvarval +61. macro fmt +62. macro gettitle +63. macro infmt +64. macro letters +65. macro libpath +66. macro minclude +67. macro monthshift +68. macro replist +69. macro time +70. macro today +71. macro translate +72. macro tranwrd +73. macro workpath + + + +Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load it +or look for the baseplus_AdditionalContent directory in the Packages fileref +localization (only if additional content was deployed during the installation process). + +* SAS package generated by generatePackage, version 20231107 * + +The SHA256 hash digest for package BasePlus: +`F*6214654B4575DC8E4BA3CF032924862C2F69A03A6384872BAA9F774EDF6A8DDA` + +--- +# Content description ############################################################################################ + +## >>> `%getVars()` macro: <<< ####################### + +The getVars() and QgetVars() macro functions +allow to extract variables names form a dataset +according to a given pattern into a list. + +The getVars() returns unquoted value [by %unquote()]. +The QgetVars() returns quoted value [by %superq()]. + +See examples below for the details. + +The `%getVars()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%getVars( + ds + <,sep=> + <,pattern=> + <,varRange=> + <,quote=> + <,mcArray=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `ds` - *Required*, the name of the dataset from + which variables are to be taken. + +* `sep = %str( )` - *Optional*, default value `%str( )`, + a variables separator on the created list. + +* `pattern = .*` - *Optional*, default value `.*` (i.e. any text), + a variable name regexp pattern, case INSENSITIVE! + +* `varRange = _all_` - *Optional*, default value `_all_`, + a named range list of variables. + +* `quote =` - *Optional*, default value is blank, a quotation + symbol to be used around values. + +* `mcArray=` - *Optional*, default value is blank. + 1) When *null* - the macro behaves like a macro function + and returns a text string with variables list. + 2) When *not null* - behaviour of the macro is altered. + In such case a macro array of selected variables, named + with `mcArray` value as a prefix, is created. + Furthermore a macro named as `mcArray` value is generated. + (see the macroArray package for the details). + When `mcArray=` parameter is active the `getVars` macro + cannot be called within the `%put` statement. Execution like: + `%put %getVars(..., mcArray=XXX);` will result with + an Explicit & Radical Refuse Of Run (aka ERROR). + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** A list of all variables from the + sashelp.class dataset: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** A list of all variables from the + sashelp.class dataset separated + by backslash: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let x = %getVars(sashelp.class, sep=\); + %put &=x; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Use of regular expressions: + a) A list of variables which name contains "i" or "a" +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class, pattern=i|a)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + b) A list of variables which name starts with "w" +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class, pattern=^w)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + c) A list of variables which name ends with "ght" +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class, pattern=ght$)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** A list of numeric variables which name + starts with "w" or "h" or ends with "x" +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class, sep=+, pattern=^(w|h)|x$, varRange=_numeric_)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 5.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data test; + array x[30]; + array y[30] $ ; + array z[30]; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + a) A list of variables separated by a comma: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(test, sep=%str(,))*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + b) A list of variables separated by a comma + with suffix 5 or 7: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(test, sep=%str(,), pattern=(5|7)$)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + c) A list of variables separated by a comma + with suffix 5 or 7 from a given variables range: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(test, sep=%str(,), varRange=x10-numeric-z22 y6-y26, pattern=(5|7)$)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6.** Case of quotes and special characters + when the quote= parameter is _not_ used: + + a) one single or double qiote: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%bquote(%getVars(sashelp.class, sep=%str(%")))*; + %put *%bquote(%getVars(sashelp.class, sep=%str(%')))*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + b) two single or double qiotes: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *"%bquote(%getVars(sashelp.class,sep=""))"*; + %put *%str(%')%bquote(%getVars(sashelp.class,sep=''))%str(%')*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + c) coma separated double quote list: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *"%getVars(sashelp.class,sep=%str(", "))"*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + d) coma separated single quote list: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%str(%')%getVars(sashelp.class,sep=', ')%str(%')*; + %let x = %str(%')%getVars(sashelp.class,sep=', ')%str(%'); + + %put *%str(%')%QgetVars(sashelp.class,sep=', ')%str(%')*; + %let y = %str(%')%QgetVars(sashelp.class,sep=', ')%str(%'); + %let z = %unquote(&y.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + e) ampersand (&) as a separator [compare behaviour]: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class,sep=&)*; + %let x = %getVars(sashelp.class,sep=&); + + %put *%getVars(sashelp.class,sep=%str( & ))*; + %let x = %getVars(sashelp.class,sep=%str( & )); + + %put *%QgetVars(sashelp.class,sep=&)*; + %let y = %QgetVars(sashelp.class,sep=&); + %let z = %unquote(&y.); + + %put *%QgetVars(sashelp.class,sep=%str( & ))*; + %let y = %QgetVars(sashelp.class,sep=%str( & )); + %let z = %unquote(&y.); + + %put *%getVars(sashelp.class,sep=&)*; + %let x = %getVars(sashelp.class,sep=&); + + %put *%getVars(sashelp.class,sep=%str( & ))*; + %let x = %getVars(sashelp.class,sep=%str( & )); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + f) percent (%) as a separator [compare behaviour]: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%QgetVars(sashelp.class,sep=%)*; + %let y = %QgetVars(sashelp.class,sep=%); + %let z = %unquote(&y.); + + %put *%QgetVars(sashelp.class,sep=%str( % ))*; + %let y = %QgetVars(sashelp.class,sep=%str( % )); + %let z = %unquote(&y.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 7.** Case of quotes and special characters + when the quote= parameter is used: + +a) one single or double qiote: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class, quote=%str(%"))*; + %put *%getVars(sashelp.class, quote=%str(%'))*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + b) two single or double quotes: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %* this gives an error: ; + %* %put *%getVars(sashelp.class,quote="")*; + %* %put *%getVars(sashelp.class,quote='')*; + + %* this does not give an error: ; + %put *%QgetVars(sashelp.class,quote="")*; + %put *%QgetVars(sashelp.class,quote='')*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + c) coma separated double quote list: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%getVars(sashelp.class,sep=%str(,),quote=%str(%"))*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + d) coma separated single quote list: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let x = %getVars(sashelp.class,sep=%str(,),quote=%str(%')); + %put &=x.; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 8.** Variables that start with `A` and do not end with `GHT`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data class; + set sashelp.class; + Aeight = height; +run; + +%put *%getVars(class, pattern = ^A(.*)(?>> `%QgetVars()` macro: <<< ####################### + +The getVars() and QgetVars() macro functions +allow to extract variables names form a dataset +according to a given pattern into a list. + +The getVars() returns unquoted value [by %unquote()]. +The QgetVars() returns quoted value [by %superq()]. + +The `%QgetVars()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%QgetVars( + ds + <,sep=> + <,pattern=> + <,varRange=> + <,quote=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `ds` - *Required*, the name of the dataset from + which variables are to be taken. + +* `sep = %str( )` - *Optional*, default value `%str( )`, + a variables separator on the created list. + +* `pattern = .*` - *Optional*, default value `.*` (i.e. any text), + a variable name regexp pattern, case INSENSITIVE! + +* `varRange = _all_` - *Optional*, default value `_all_`, + a named range list of variables. + +* `quote =` - *Optional*, default value is blank, a quotation + symbol to be used around values. + +### EXAMPLES AND USECASES: #################################################### + +See examples in `%getVars()` help for the details. + +--- + +## >>> `%symdelGlobal()` macro: <<< ####################### + +The `%symdelGlobal()` macro deletes all global macrovariables +created by the user. The only exceptions are read only variables +and variables the one which starts with SYS, AF, or FSP. +In that case a warning is printed in the log. + +One temporary global macrovariable `________________98_76_54_32_10_` +and a dataset, in `work` library, named `_%sysfunc(datetime(),hex7.)` +are created and deleted during the process. + +The `%symdelGlobal()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%symdelGlobal( + info +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `info` - *Optional*, default value should be empty, + if set to `NOINFO` or `QUIET` then infos and + warnings about variables deletion are suspended. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Basic use-case one. + Delete global macrovariables, info notes + and warnings are printed in the log. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let a = 1; + %let b = 2; + %let c = 3; + %let sys_my_var = 11; + %let af_my_var = 22; + %let fsp_my_var = 33; + %global / readonly read_only_x = 1234567890; + + %put _user_; + + %symdelGlobal(); + + %put _user_; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Basic use-case two. + Delete global macrovariables in quite mode + No info notes and warnings are printed in the log. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let a = 1; + %let b = 2; + %let c = 3; + %let sys_my_var = 11; + %let af_my_var = 22; + %let fsp_my_var = 33; + %global / readonly read_only_x = 1234567890; + + %put _user_; + %put *%symdelGlobal(NOINFO)*; + %put _user_; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--- + +## >>> `bool.` format: <<< ####################### + +The **bool** format returns: +*zero* for 0 or missing, +*one* for other values. + +### EXAMPLES AND USECASES: #################################################### + +It allows for a %sysevalf()'ish +conversion-type [i.e. `%sysevalf(1.7 & 4.2, boolean)`] +inside the `%sysfunc()` [e.g. `%sysfunc(aFunction(), bool.)`] + +--- + +## >>> `boolz.` format: <<< ####################### + +The **boolz** format returns: +*zero* for 0 or missing, +*one* for other values. + +*Fuzz* value is 0. + +### EXAMPLES AND USECASES: #################################################### + +It allows for a %sysevalf()'ish +conversion-type [i.e. `%sysevalf(1.7 & 4.2, boolean)`] +inside the `%sysfunc()` [e.g. `%sysfunc(aFunction(), boolz.)`] + +--- + +## >>> `ceil.` format: <<< ####################### + +The **ceil** format is a "wrapper" for the `ceil()` function. + +### EXAMPLES AND USECASES: #################################################### + +It allows for a %sysevalf()'ish +conversion-type [i.e. `%sysevalf(1.7 + 4.2, ceil)`] +inside the `%sysfunc()` [e.g. `%sysfunc(aFunction(), ceil.)`] + +--- + +## >>> `floor.` format: <<< ####################### + +The **floor** format is a "wrapper" for the `floor()` function. + +### EXAMPLES AND USECASES: #################################################### + +It allows for a %sysevalf()'ish +conversion-type [i.e. `%sysevalf(1.7 + 4.2, floor)`] +inside the `%sysfunc()` [e.g. `%sysfunc(aFunction(), floor.)`] + +--- + +## >>> `int.` format: <<< ####################### + +The **int** format is a "wrapper" for the `int()` function. + +### EXAMPLES AND USECASES: #################################################### + +It allows for a %sysevalf()'ish +conversion-type [i.e. `%sysevalf(1.7 + 4.2, integer)`] +inside the `%sysfunc()` [e.g. `%sysfunc(aFunction(), int.)`] + +--- + +## >>> `arrFill()` subroutine: <<< ####################### + +The **arrFill()** subroutine is a wrapper +for the Call Fillmatrix() [a special FCMP subroutine]. + +A numeric array is filled with selected numeric value, e.g. + +for array `A = [. . . .]` the subroutine +`call arrFill(42, A)` returns `A = [42 42 42 42]` + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +call arrFill(N ,A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `N` - Numeric value. + +2. `A` - Numeric array. + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; + array X[*] a b c; + + put "before: " (_all_) (=); + call arrFill(42, X); + put "after: " (_all_) (=); + +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `arrFillC()` subroutine: <<< ####################### + +The **arrFillC()** subroutine fills +a character array with selected character value, e.g. + +for array `A = [" ", " ", " "]` the subroutine +`call arrFillC("B", A)` returns `A = ["B", "B", "B"]` + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +call arrFillC(C ,A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `C` - Character value. + +2. `A` - Character array. + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; + array X[*] $ a b c; + + put "before: " (_all_) (=); + call arrFillC("ABC", X); + put "after: " (_all_) (=); + +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `arrMissFill()` subroutine: <<< ####################### + +The **arrMissFill()** subroutine fills +all missing values (i.e. less or equal than `.Z`) +of a numeric array with selected numeric value, e.g. + +for array `A = [1 . . 4]` the subroutine +`call arrMissFill(42, A)` returns `A = [1 42 42 4]` + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +call arrMissFill(N ,A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `N` - Numeric value. + +2. `A` - Numeric array. + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data have; + input a b c; +cards4; +1 . 3 +. 2 . +. . 3 +;;;; +run; + +data _null_; + set have ; + array X[*] a b c; + + put "before: " (_all_) (=); + call arrMissFill(42, X); + put "after: " (_all_) (=); + +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `arrMissFillC()` subroutine: <<< ####################### + +The **arrMissFillC()** subroutine fills +all missing values of a character array +with selected character value, e.g. + +for array `A = ["A", " ", "C"]` the subroutine +`call arrMissFillC("B", A)` returns `A = ["A", "B", "C"]` + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +call arrMissFillC(C, A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `C` - Character value. + +2. `A` - Character array. + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data have; + infile cards dsd dlm="," missover; + input (a b c) (: $ 1.); +cards4; +A, ,C + ,B, + , ,C +;;;; +run; + +data _null_; + set have ; + array X[*] $ a b c; + + put "before: " (_all_) (=); + call arrMissFillC("X", X); + put "after: " (_all_) (=); + +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `arrMissToLeft()` subroutine: <<< ####################### + +The **arrMissToLeft()** subroutine shifts +all non-missing (i.e. greater than `.Z`) +numeric elements to the right side of an array +and missing values to the left, e.g. + +for array `A = [1 . 2 . 3]` the subroutine +`call arrMissToLeft(A)` returns `A = [. . 1 2 3]` + +All missing values are replaced with the dot (`.`) + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +call arrMissToLeft(A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `A` - Numeric array. + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data have; + input a b c; +cards4; +1 . 3 +. 2 . +. . 3 +;;;; +run; + +data _null_; + set have ; + array X[*] a b c; + + put "before: " (_all_) (=); + call arrMissToLeft(X); + put "after: " (_all_) (=); + +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `arrMissToLeftC()` subroutine: <<< ####################### + +The **arrMissToLeftC()** subroutine shifts +all non-missing (i.e. different than empty string) +character elements to the right side of an array +and all missing values to the left, e.g. + +for array `A = ["A", " ", "B", " ", "C"]` the subroutine +`call arrMissToLeftC(A)` returns `A = [" ", " ", "A", "B", "C"]` + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +call arrMissToLeftC(A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `A` - Character array. + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data have; + infile cards dsd dlm="," missover; + input (a b c) (: $ 1.); +cards4; +A, ,C + ,B, + , ,C +;;;; +run; + +data _null_; + set have ; + array X[*] $ a b c; + + put "before: " (_all_) (=); + call arrMissToLeftC(X); + put "after: " (_all_) (=); + +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `arrMissToRight()` subroutine: <<< ####################### + +The **arrMissToRight()** subroutine shifts +all non-missing (i.e. greater than `.Z`) +numeric elements to the left side of an array +and missing values to the right, e.g. + +for array `A = [1 . 2 . 3]` the subroutine +`call arrMissToRight(A)` returns `A = [1 2 3 . .]` + +All missing values are replaced with the dot (`.`) + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +call arrMissToRight(A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `A` - Numeric array. + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data have; + input a b c; +cards4; +1 . 3 +. 2 . +. . 3 +;;;; +run; + +data _null_; + set have ; + array X[*] a b c; + + put "before: " (_all_) (=); + call arrMissToRight(X); + put "after: " (_all_) (=); + +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `arrMissToRightC()` subroutine: <<< ####################### + +The **arrMissToRightC()** subroutine shifts +all non-missing (i.e. different than empty string) +character elements to the left side of an array +and missing values to the right, e.g. + +for array `A = ["A", " ", "B", " ", "C"]` the subroutine +`call arrMissToRightC(A)` returns `A = ["A", "B", "C", " ", " "]` + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +call arrMissToRightC(A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `A` - Character array. + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data have; + infile cards dsd dlm="," missover; + input (a b c) (: $ 1.); +cards4; +A, ,C + ,B, + , ,C +;;;; +run; + +data _null_; + set have ; + array X[*] $ a b c; + + put "before: " (_all_) (=); + call arrMissToRightC(X); + put "after: " (_all_) (=); + +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `catXFc()` function: <<< ####################### + +The **catXFc()** function is a wrapper +of the `catX()` function but with ability +to format character values. + +For array `A = ["a", " ", "c"]` the +`catXFc("upcase.", "*", A)` returns `"A*C"`. + +If format does not handle nulls they are ignored. + +*Caution!* Array parameters to function calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +catXFc(format, delimiter, A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `format` - A name of the *character* format to be used. + +2. `delimiter` - A delimiter string to be used. + +3. `A` - Character array + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; + t = "t"; + u = " "; + v = "v"; + + array b[*] t u v; + + length s $ 17; + s = catXFc("upcase.", "*", B); + put (_all_) (=); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `catXFi()` function: <<< ####################### + +The **catXFi()** function is a wrapper +of the `catX()` function but with ability +to format numeric values but +IGNORES missing values (i.e. `._`, `.`, `.a`, ..., `.z`). + +For array `A = [0, ., 2]` the +`catXFi("date9.", "#", A)` returns +`"01JAN1960#03JAN1960"` + +*Caution!* Array parameters to function calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +catXFi(format, delimiter, A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `format` - A name of the *numeric* format to be used. + +2. `delimiter` - A delimiter string to be used. + +3. `A` - Numeric array + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; + x = 1; + y = .; + z = 3; + + array a[*] x y z; + + length s $ 17; + s = catXFi("z5.", "#", A); + put (_all_) (=); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `catXFj()` function: <<< ####################### + +The **catXFj()** function is a wrapper +of the catX() function but with ability +to format character values. + +For array `A = ["a", " ", "c"]` the +`catXFj("upcase.", "*", A)` returns `"A**C"` + +If format does not handle nulls they are +printed as an empty string. + +*Caution!* Array parameters to function calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +catXFj(format, delimiter, A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `format` - A name of the *character* format to be used. + +2. `delimiter` - A delimiter string to be used. + +3. `A` - Character array + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; + t = "t"; + u = " "; + v = "v"; + + array b[*] t u v; + + length s $ 17; + s = catXFj("upcase.", "*", B); + put (_all_) (=); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `catXFn()` function: <<< ####################### + +The **catXFn()** function is a wrapper +of the `catX()` function but with ability +to format numeric values. + +For array `A = [0, 1, 2]` the +`catXFn("date9.", "#", A)` returns +`"01JAN1960#02JAN1960#03JAN1960"` + +*Caution!* Array parameters to function calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +catXFn(format, delimiter, A) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `format` - A name of the *numeric* format to be used. + +2. `delimiter` - A delimiter string to be used. + +3. `A` - Numeric array + + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; + x = 1; + y = .; + z = 3; + + array a[*] x y z; + + length s $ 17; + s = catXFn("z5.", "#", A); + put (_all_) (=); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `delDataset()` function: <<< ####################### + +The **delDataset()** function is a "wrapper" +for the `Fdelete()` function. +`delDataset()` function uses a text string with +a dataset name as an argument. + +Function checks for `*.sas7bdat`, `*.sas7bndx`, +and `*.sas7bvew` files and delete them. +Return code of 0 means dataset was deleted. + +For compound library files are +deleted from _ALL_ locations! + + +*Note:* +Currently only the BASE SAS engine datasets/views are deleted. + +Tested on Windows and Linux. Not tested on Z/OS. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +delDataset(lbds_) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `lbds_` - *Required*, character argument containing + name of the dataset/view to be deleted. + The `_last_` special name is honored. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data TEST1 TEST2(index=(x)); + x = 17; + run; + + data TEST3 / view=TEST3; + set test1; + run; + + data _null_; + p = delDataset("WORK.TEST1"); + put p=; + + p = delDataset("TEST2"); + put p=; + + p = delDataset("WORK.TEST3"); + put p=; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 2.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data TEST4; + x=42; + run; + data _null_; + p = delDataset("_LAST_"); + put p=; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 3.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options dlcreatedir; + libname user "%sysfunc(pathname(work))/user"; + + data TEST5; + x=42; + run; + + data _null_; + p = delDataset("test5"); + put p=; + run; + + libname user clear; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 4.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data TEST6; + x=42; + run; + + %put *%sysfunc(delDataset(test6))*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 5.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options dlcreatedir; + libname L1 "%sysfunc(pathname(work))/L)1"; + libname L2 "%sysfunc(pathname(work))/L(2"; + libname L3 "%sysfunc(pathname(work))/L'3"; + + data L1.TEST7 L2.TEST7 L3.TEST7; + x=42; + run; + + libname L12 ("%sysfunc(pathname(work))/L(1" "%sysfunc(pathname(work))/L)2"); + libname L1L2 (L2 L3); + + %put *%sysfunc(delDataset(L12.test7))*; + %put *%sysfunc(delDataset(L1L2.test7))*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `qsortInCbyProcProto()` proto function: <<< ####################### + +The **qsortInCbyProcProto()** is external *C* function, +this is the implementation of the *Quick Sort* algorithm. + +The function is used **internally** by +functions in the *BasePlus* package. + +Asumptions: +- smaller subarray is sorted first, +- subarrays of *size < 11* are sorted by *insertion sort*, +- pivot is selected as median of low index value, + high index value, and (low+high)/2 index value. + +`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`
+`!CAUTION! Sorted array CANNOT contains SAS missing values !`
+`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`
+ +### SYNTAX: ################################################################### + +The basic syntax is the following: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +qsortInCbyProcProto(arr, low, high) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `arr` - An array of double type to be sorted. + +2. `low` - An integer low index of starting position (from which the sorting is done). + +3. `high` - An integer high index of ending position (up to which the sorting is done). + + +### REFERENCES: #################################################### + +*Reference 1.* + +Insertion sort for arrays smaller then 11 elements: + +Based on the code from the following WikiBooks page [2020.08.14]: + +[https://pl.wikibooks.org/wiki/Kody_%C5%BAr%C3%B3d%C5%82owe/Sortowanie_przez_wstawianie](https://pl.wikibooks.org/wiki/Kody_%C5%BAr%C3%B3d%C5%82owe/Sortowanie_przez_wstawianie) + + +*Reference 2.* + +Iterative Quick Sort: + +Based on the code from the following pages [2020.08.14]: + +[https://www.geeksforgeeks.org/iterative-quick-sort/](https://www.geeksforgeeks.org/iterative-quick-sort/) + +[https://www.geeksforgeeks.org/c-program-for-iterative-quick-sort/](https://www.geeksforgeeks.org/c-program-for-iterative-quick-sort/) + +--- + +## >>> `fromMissingToNumberBS()` function: <<< ####################### + +The **fromMissingToNumberBS()** function +gets numeric missing value or a number +as an argument and returns an integer +from 1 to 29. + +For a numeric missing argument +the returned values are: +- 1 for `._` +- 2 for `.` +- 3 for `.a` +- ... +- 28 for `.z` and +- 29 for *all other*. + +The function is used **internally** by +functions in the *BasePlus* package. + +For *missing value arguments* the function +is an inverse of the `fromNumberToMissing()` function. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +fromMissingToNumberBS(x) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `x` - A numeric missing value or a number. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data _null_; + do x = ._, ., .a, .b, .c, 42; + y = fromMissingToNumberBS(x); + put x= y=; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `fromNumberToMissing()` function: <<< ####################### + +The **fromNumberToMissing()** function +gets a number as an argument and returns +a numeric missing value or zero. + +For a numeric argument +the returned values are: +- `._` for 1 +- `.` for 2 +- `.a` for 3 +- ... +- `.z` for 28 and +- `0` for *all other*. + +The function is used **internally** by +functions in the *BasePlus* package. + +For arguments 1,2,3, ..., and 28 the function +is an inverse of the `fromMissingToNumberBS()` function. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +fromNumberToMissing(x) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `x` - A numeric value. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data _null_; + do x = 1 to 29; + y = fromNumberToMissing(x); + put x= y=; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `quickSort4NotMiss()` subroutine: <<< ####################### + +The **quickSort4NotMiss()** subroutine is an alternative to the +`CALL SORTN()` subroutine for 1-based big arrays (i.e. `> 10'000'000` elements) +when memory used by `call sortn()` may be an issue. +For smaller arrays the memory footprint is not significant. + +The subroutine is based on an iterative quick sort algorithm +implemented in the `qsortInCbyProcProto()` *C* prototype function. + + +**Caution 1!** Array _CANNOT_ contains missing values! + +**Caution 2!** Array parameters to subroutine calls must be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call quickSort4NotMiss(A) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `A` - Argument is a 1-based array of NOT missing numeric values. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** For session with 8GB of RAM, + array of size 250'000'000 with values in range + from 0 to 99'999'999 and _NO_ missing values. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let size = 250000000; + options fullstimer; + + data _null_; + array test[&size.] _temporary_ ; + + t = time(); + call streaminit(123); + do _N_ = &size. to 1 by -1; + test[_N_] = int(100000000*rand("uniform")); + end; + t = time() - t; + put "Array population time: " t; + + put "First 50 elements before sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + + t = time(); + call quickSort4NotMiss (test); + t = time()-t; + put "Sorting time: " / t=; + + put; put "First 50 elements after sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 2.** Resources comparison for + session with 8GB of RAM. + + Array of size 250'000'000 with random values + from 0 to 999'999'999 and _NO_ missing values. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 8.82s + memory 1'953'470.62k + OS Memory 1'977'436.00k + + Call quickSort4NotMiss: + Sorting time 66.92s + Memory 1'954'683.06k + OS Memory 1'977'436.00k + + Call quickSortLight: + Sorting time 70.98s + Memory 1'955'479.71k + OS Memory 1'977'436.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `quickSortHash()` subroutine: <<< ####################### + +The **quickSortHash()** subroutine is an alternative to the +`CALL SORTN()` subroutine for 1-based big arrays (i.e. `> 10'000'000` elements) +when memory used by `call sortn()` may be an issue. +For smaller arrays the memory footprint is not significant. + +The subroutine is based on an iterative quick sort algorithm +implemented in the `qsortInCbyProcProto()` *C* prototype function. + +The number of "sparse distinct data values" is set to `100'000` to +use the hash sort instead of the quick sort. + E.g. when number of unique values for sorting is less then + 100'000 then an ordered hash table is used to store the data + and their count and sort them. + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +*Note!* Due to improper memory reporting/releasing for hash + tables in FCMP procedure the reported memory used after running + the function may not be in line with the RAM memory required + for processing. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call quickSortHash(A) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `A` - Argument is a 1-based array of numeric values. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** For session with 8GB of RAM + Array of size 250'000'000 with values in range + from 0 to 99'999'999 and around 10% of various + missing values. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let size = 250000000; + options fullstimer; + + data _null_; + array test[&size.] _temporary_ ; + + array m[0:27] _temporary_ + (._ . .A .B .C .D .E .F .G .H .I .J .K .L + .M .N .O .P .Q .R .S .T .U .V .W .X .Y .Z); + + t = time(); + call streaminit(123); + do _N_ = &size. to 1 by -1; + _I_ + 1; + if rand("uniform") > 0.1 then test[_I_] = int(100000000*rand("uniform")); + else test[_I_] = m[mod(_N_,28)]; + end; + t = time() - t; + put "Array population time: " t; + + put "First 50 elements before sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + + t = time(); + call quickSortHash (test); + t = time()-t; + put "Sorting time: " / t=; + + put; put "First 50 elements after sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 2.** For session with 8GB of RAM + Array of size 250'000'000 with values in range + from 0 to 9'999 and around 10% of various + missing values. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let size = 250000000; + options fullstimer; + + data _null_; + array test[&size.] _temporary_ ; + + array m[0:27] _temporary_ + (._ . .A .B .C .D .E .F .G .H .I .J .K .L + .M .N .O .P .Q .R .S .T .U .V .W .X .Y .Z); + + t = time(); + call streaminit(123); + do _N_ = &size. to 1 by -1; + _I_ + 1; + if rand("uniform") > 0.1 then test[_I_] = int(10000*rand("uniform")); + else test[_I_] = m[mod(_N_,28)]; + end; + t = time() - t; + put "Array population time: " t; + + put "First 50 elements before sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + + t = time(); + call quickSortHash (test); + t = time()-t; + put "Sorting time: " / t=; + + put; put "First 50 elements after sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 3.** Resources comparison for + session with 8GB of RAM + + A) Array of size 10'000'000 with + random values from 0 to 9'999 range (sparse) + and around 10% of missing data. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 0.61s + Memory 78'468.50k + OS Memory 101'668.00k + + Call sortn: + Sorting time 0.87s + Memory 1'120'261.53k + OS Memory 1'244'968.00k + + Call quickSortHash: + Sorting time 6.76s + Memory 1'222'242.75k(*) + OS Memory 1'402'920.00k(*) + + Call quickSortLight: + Sorting time 23.45s + Memory 80'527.75k + OS Memory 101'924.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + B) Array of size 10'000'000 with + random values from 0 to 99'999'999 range (dense) + and around 10% of missing data. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 0.6s + Memory 78'463.65k + OS Memory 101'924.00k + + Call sortn: + Sorting time 1.51s + Memory 1'120'253.53k + OS Memory 1'244'968.00k + + Call quickSortHash: + Sorting time 6.28s + Memory 1'222'241.93k(*) + OS Memory 1'402'920.00k(*) + + Call quickSortLight: + Sorting time 0.78s + Memory 80'669.28k + OS Memory 102'436.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + C) Array of size 250'000'000 with + random values from 0 to 999'999'999 range (dense) + and around 10% of missing data. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 15.34s + memory 1'953'471.81k + OS Memory 1'977'436.00k + + Call sortn: + FATAL: Insufficient memory to execute DATA step program. + Aborted during the COMPILATION phase. + ERROR: The SAS System stopped processing this step + because of insufficient memory. + + Call quickSortHash: + Sorting time 124.68s + Memory 7'573'720.34k(*) + OS Memory 8'388'448.00k(*) + + Call quickSortLight: + Sorting time 72.41s + Memory 1'955'520.78k + OS Memory 1'977'180.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + D) Array of size 250'000'000 with + random values from 0 to 99'999 range (sparse) + and around 10% of missing data. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 16.07 + Memory 1'953'469.78k + OS Memory 1'977'180.00k + + Call sortn: + FATAL: Insufficient memory to execute DATA step program. + Aborted during the COMPILATION phase. + ERROR: The SAS System stopped processing this step + because of insufficient memory. + + Call quickSortHash: + Sorting time 123.5s + Memory 7'573'722.03k + OS Memory 8'388'448.00k + + Call quickSortLight: + Sorting time 1'338.25s + Memory 1'955'529.90k + OS Memory 1'977'436.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +(*) When using hash tables in `Proc FCMP` the RAM + usage is not indicated properly. The memory + allocation is reported up to the session limit + and then reused if needed. The really required + memory is in fact much less then reported. + +--- + +## >>> `quickSortHashSDDV()` subroutine: <<< ####################### + +The **quickSortHashSDDV()** subroutine is an alternative to the +`CALL SORTN()` subroutine for 1-based big arrays (i.e. `> 10'000'000` elements) +when memory used by `call sortn()` may be an issue. +For smaller arrays the memory footprint is not significant. + +The subroutine is based on an iterative quick sort algorithm +implemented in the `qsortInCbyProcProto()` *C* prototype function. + +The number of "sparse distinct data values" (argument `SDDV`) may +be adjusted to use the hash sort instead of the quick sort. + E.g. when number of unique values for sorting is less then + some *N* then an ordered hash table is used to store the data + and their count and sort them. + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +*Note!* Due to improper memory reporting/releasing for hash + tables in FCMP procedure the report memory used after running + the function may not be in line with the RAM memory required + for processing. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call quickSortHashSDDV(A, SDDV) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `A` - Argument is a 1-based array of numeric values. + +2. `SDDV` - A number of distinct data values, e.g. 100'000. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** For session with 8GB of RAM + Array of size 250'000'000 with values in range + from 0 to 99'999'999 and around 10% of various + missing values. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let size = 250000000; + options fullstimer; + + data _null_; + array test[&size.] _temporary_ ; + + array m[0:27] _temporary_ + (._ . .A .B .C .D .E .F .G .H .I .J .K .L + .M .N .O .P .Q .R .S .T .U .V .W .X .Y .Z); + + t = time(); + call streaminit(123); + do _N_ = &size. to 1 by -1; + _I_ + 1; + if rand("uniform") > 0.1 then test[_I_] = int(100000000*rand("uniform")); + else test[_I_] = m[mod(_N_,28)]; + end; + t = time() - t; + put "Array population time: " t; + + put "First 50 elements before sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + + t = time(); + call quickSortHashSDDV (test, 2e4); + t = time()-t; + put "Sorting time: " / t=; + + put; put "First 50 elements after sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 2.** For session with 8GB of RAM + Array of size 250'000'000 with values in range + from 0 to 9'999 and around 10% of various + missing values. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let size = 250000000; + options fullstimer; + + data _null_; + array test[&size.] _temporary_ ; + + array m[0:27] _temporary_ + (._ . .A .B .C .D .E .F .G .H .I .J .K .L + .M .N .O .P .Q .R .S .T .U .V .W .X .Y .Z); + + t = time(); + call streaminit(123); + do _N_ = &size. to 1 by -1; + _I_ + 1; + if rand("uniform") > 0.1 then test[_I_] = int(10000*rand("uniform")); + else test[_I_] = m[mod(_N_,28)]; + end; + t = time() - t; + put "Array population time: " t; + + put "First 50 elements before sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + + t = time(); + call quickSortHashSDDV (test, 2e4); + t = time()-t; + put "Sorting time: " / t=; + + put; put "First 50 elements after sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `quickSortLight()` subroutine: <<< ####################### + +The **quickSortLight()** subroutine is an alternative to the +`CALL SORTN()` subroutine for 1-based big arrays (i.e. `> 10'000'000` elements) +when memory used by `call sortn()` may be an issue. +For smaller arrays the memory footprint is not significant. + +The subroutine is based on an iterative quick sort algorithm +implemented in the `qsortInCbyProcProto()` *C* prototype function. + +*Caution!* Array parameters to subroutine calls *must* be 1-based. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +call quickSortLight(A) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `A` - Argument is a 1-based array of numeric values. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** For session with 8GB of RAM + Array of size 250'000'000 with values in range + from 0 to 99'999'999 and around 10% of various + missing values. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let size = 250000000; + options fullstimer; + + data _null_; + array test[&size.] _temporary_ ; + + array m[0:27] _temporary_ + (._ . .A .B .C .D .E .F .G .H .I .J .K .L + .M .N .O .P .Q .R .S .T .U .V .W .X .Y .Z); + + t = time(); + call streaminit(123); + do _N_ = &size. to 1 by -1; + _I_ + 1; + if rand("uniform") > 0.1 then test[_I_] = int(100000000*rand("uniform")); + else test[_I_] = m[mod(_N_,28)]; + end; + t = time() - t; + put "Array population time: " t; + + put "First 50 elements before sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + + t = time(); + call quickSortLight (test); + t = time()-t; + put "Sorting time: " / t=; + + put; put "First 50 elements after sorting:"; + do _N_ = 1 to 20; + put test[_N_] = @; + end; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**Example 2.** Resources comparison for + session with 8GB of RAM. + + Array of size 250'000'000 with random values + from 0 to 999'999'999 and _NO_ missing values. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 8.82s + memory 1'953'470.62k + OS Memory 1'977'436.00k + + Call quickSort4NotMiss: + Sorting time 66.92s + Memory 1'954'683.06k + OS Memory 1'977'436.00k + + Call quickSortLight: + Sorting time 70.98s + Memory 1'955'479.71k + OS Memory 1'977'436.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Example 3.** Resources comparison for + session with 8GB of RAM + + A) Array of size 10'000'000 with + random values from 0 to 9'999 range (sparse) + and around 10% of missing data. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 0.61s + Memory 78'468.50k + OS Memory 101'668.00k + + Call sortn: + Sorting time 0.87s + Memory 1'120'261.53k + OS Memory 1'244'968.00k + + Call quickSortHash: + Sorting time 6.76s + Memory 1'222'242.75k(*) + OS Memory 1'402'920.00k(*) + + Call quickSortLight: + Sorting time 23.45s + Memory 80'527.75k + OS Memory 101'924.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + B) Array of size 10'000'000 with + random values from 0 to 99'999'999 range (dense) + and around 10% of missing data. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 0.6s + Memory 78'463.65k + OS Memory 101'924.00k + + Call sortn: + Sorting time 1.51s + Memory 1'120'253.53k + OS Memory 1'244'968.00k + + Call quickSortHash: + Sorting time 6.28s + Memory 1'222'241.93k(*) + OS Memory 1'402'920.00k(*) + + Call quickSortLight: + Sorting time 0.78s + Memory 80'669.28k + OS Memory 102'436.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + C) Array of size 250'000'000 with + random values from 0 to 999'999'999 range (dense) + and around 10% of missing data. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 15.34s + memory 1'953'471.81k + OS Memory 1'977'436.00k + + Call sortn: + FATAL: Insufficient memory to execute DATA step program. + Aborted during the COMPILATION phase. + ERROR: The SAS System stopped processing this step + because of insufficient memory. + + Call quickSortHash: + Sorting time 124.68s + Memory 7'573'720.34k(*) + OS Memory 8'388'448.00k(*) + + Call quickSortLight: + Sorting time 72.41s + Memory 1'955'520.78k + OS Memory 1'977'180.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + D) Array of size 250'000'000 with + random values from 0 to 99'999 range (sparse) + and around 10% of missing data. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + Array: + Population time 16.07 + Memory 1'953'469.78k + OS Memory 1'977'180.00k + + Call sortn: + FATAL: Insufficient memory to execute DATA step program. + Aborted during the COMPILATION phase. + ERROR: The SAS System stopped processing this step + because of insufficient memory. + + Call quickSortHash: + Sorting time 123.5s + Memory 7'573'722.03k + OS Memory 8'388'448.00k + + Call quickSortLight: + Sorting time 1'338.25s + Memory 1'955'529.90k + OS Memory 1'977'436.00k +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +(*) When using hash tables in `Proc FCMP` the RAM + usage is not indicated properly. The memory + allocation is reported up to the session limit + and then reused if needed. The really required + memory is in fact much less then reported. + +--- + +## >>> `%dedupListS()` macro: <<< ####################### + +The `%dedupListS()` macro deletes duplicated values from +a *SPACE separated* list of values. List, including separators, +can be no longer than a value carried by a single macrovariable. + +Returned value is *unquoted*. + +The `%dedupListS()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%dedupListS( + list of space separated values +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `list` - A list of *space separated* values. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Basic use-case one. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%dedupListS(a b c b c)*; + + %put *%dedupListS(a b,c b,c)*; + + %put *%dedupListS(%str(a b c b c))*; + + %put *%dedupListS(%str(a) %str(b) %str(c) b c)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Macro variable as an argument. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let list = 4 5 6 1 2 3 1 2 3 4 5 6; + %put *%dedupListS(&list.)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%dedupListC()` macro: <<< ####################### + +The `%dedupListC()` macro deletes duplicated values from +a *COMMA separated* list of values. List, including separators, +can be no longer than a value carried by a single macrovariable. + +Returned value is *unquoted*. Leading and trailing spaces are ignored. + +The `%dedupListC()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%dedupListC( + list,of,comma,separated,values +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `list` - A list of *comma separated* values. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Basic use-case one. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%dedupListC(a,b,c,b,c)*; + + %put *%dedupListC(a,b c,b c)*; + + %put *%dedupListC(%str(a,b,c,b,c))*; + + %put *%dedupListC(%str(a),%str(b),%str(c),b,c)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Leading and trailing spaces are ignored. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%dedupListC( a , b b , c , b b, c )*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 3.** Macro variable as an argument. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let list = 4, 5, 6, 1, 2, 3, 1, 2, 3, 4, 5, 6; + %put *%dedupListC(&list.)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%dedupListP()` macro: <<< ####################### + +The `%dedupListP()` macro deletes duplicated values from +a *PIPE(`|`) separated* list of values. List, including separators, +can be no longer than a value carried by a single macrovariable. + +Returned value is *unquoted*. Leading and trailing spaces are ignored. + +The `%dedupListP()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%dedupListP( + list|of|pipe|separated|values +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `list` - A list of *pipe separated* values. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Basic use-case one. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%dedupListP(a|b|c|b|c)*; + + %put *%dedupListP(a|b c|b c)*; + + %put *%dedupListP(%str(a|b|c|b|c))*; + + %put *%dedupListP(%str(a)|%str(b)|%str(c)|b|c)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Leading and trailing spaces are ignored. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%dedupListP( a | b b | c | b b| c )*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 3.** Macro variable as an argument. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let list = 4|5|6|1|2|3|1|2|3|4|5|6; + %put *%dedupListP(&list.)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%dedupListX()` macro: <<< ####################### + +The `%dedupListX()` macro deletes duplicated values from +a *X separated* list of values, where the `X` represents +a *single character* separator. List, including separators, +can be no longer than a value carried by a single macrovariable. + +**Caution.** The value of `X` *has to be* in **the first** byte of the list, + just after the opening bracket, i.e. `(X...)`. + +Returned value is *unquoted*. Leading and trailing spaces are ignored. + +The `%dedupListX()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%dedupListX( +XlistXofXxXseparatedXvalues +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `list` - A list of *X separated* values. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Basic use-case one. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%dedupListX(|a|b|c|b|c)*; + + %put *%dedupListX( a b c b c)*; + + %put *%dedupListX(,a,b,c,b,c)*; + + %put *%dedupListX(XaXbXcXbXc)*; + + %put *%dedupListX(/a/b/c/b/c)*; + + data _null_; + x = "%dedupListX(%str(;a;b;c;b;c))"; + put x=; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Leading and trailing spaces are ignored. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%dedupListX(| a | b.b | c | b.b| c )*; + + %put *%dedupListX(. a . b b . c . b b. c )*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 3.** Macro variable as an argument. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let list = 4$5.5$6$1$2$3$1$2$3$4$5.5$6; + %put *%dedupListX($&list.)*; + + %let list = 4$ 5.5$ 6$ 1$ 2$ 3$ 1$ 2$ 3$ 4$ 5.5$ 6$; + %put *%dedupListX( &list.)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%QdedupListX()` macro: <<< ####################### + +The `%QdedupListX()` macro deletes duplicated values from +a *X separated* list of values, where the `X` represents +a *single character* separator. List, including separators, +can be no longer than a value carried by a single macrovariable. + +**Caution.** The value of `X` *has to be* in **the first** byte of the list, + just after the opening bracket, i.e. `(X...)`. + +Returned value is **quoted** with `%superq()`. Leading and trailing spaces are ignored. + +The `%QdedupListX()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%QdedupListX( +XlistXofXxXseparatedXvalues +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `list` - A list of *X separated* values. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Basic use-case one. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%QdedupListX(|a|b|c|b|c)*; + + %put *%QdedupListX( a b c b c)*; + + %put *%QdedupListX(,a,b,c,b,c)*; + + %put *%QdedupListX(XaXbXcXbXc)*; + + %put *%QdedupListX(/a/b/c/b/c)*; + + %put *%QdedupListX(%str(;a;b;c;b;c))*; + + %put *%QdedupListX(%nrstr(&a&b&c&b&c))*; + + %put *%QdedupListX(%nrstr(%a%b%c%b%c))*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Leading and trailing spaces are ignored. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%QdedupListX(| a | b.b | c | b.b| c )*; + + %put *%QdedupListX(. a . b b . c . b b. c )*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 3.** Macro variable as an argument. + Delete duplicated values from a list. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let list = 4$5.5$6$1$2$3$1$2$3$4$5.5$6; + %put *%QdedupListX($&list.)*; + + %let list = 4$ 5.5$ 6$ 1$ 2$ 3$ 1$ 2$ 3$ 4$ 5.5$ 6$; + %put *%QdedupListX( &list.)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `brackets.` format: <<< ####################### + +The **brackets** format adds brackets around a text or a number. +Leading and trailing spaces are dropped before adding brackets. + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; + input x; + if x < 0 then put x= brackets.; + else put x= best32.; +cards; +2 +1 +0 +-1 +-2 +; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `semicolon.` format: <<< ####################### + +The **semicolon** format adds semicolon after text or number. +Leading and trailing spaces are dropped before adding semicolon. + +### EXAMPLES AND USECASES: #################################################### + +**Example 1.** + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; + x = 1; + y = "A"; + put x= semicolon. y= $semicolon.; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `bracketsC()` function: <<< ####################### + +The **bracketsC()** function is internal function used by the *brackets* format. +Returns character value of length 32767. + +### SYNTAX: ################################################################### + +The basic syntax is the following: +~~~~~~~~~~~~~~~~~~~~~~~sas +bracketsC(X) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `X` - Character value. + +--- + +## >>> `bracketsN()` function: <<< ####################### + +The **bracketsN()** function is internal function used by the *brackets* format. +Returns character value of length 34. + +### SYNTAX: ################################################################### + +The basic syntax is the following: +~~~~~~~~~~~~~~~~~~~~~~~sas +bracketsN(X) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `X` - Numeric value. + +--- + +## >>> `semicolonC()` function: <<< ####################### + +The **semicolonC()** function is internal function used by the *semicolon* format. +Returns character value of length 32767. + +### SYNTAX: ################################################################### + +The basic syntax is the following: +~~~~~~~~~~~~~~~~~~~~~~~sas +semicolonC(X) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `X` - Character value. + +--- + +## >>> `semicolonN()` function: <<< ####################### + +The **semicolonN()** function is internal function used by the *semicolon* format. +Returns character value of length 33. + +### SYNTAX: ################################################################### + +The basic syntax is the following: +~~~~~~~~~~~~~~~~~~~~~~~sas +semicolonN(X) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `X` - Numeric value. + +--- + +## >>> `%QzipEvalf()` macro: <<< ####################### + +The zipEvalf() and QzipEvalf() macro functions +allow to use a function on elements of pair of +space separated lists. + +For two space separated lists of text strings the corresponding +elements are taken and the macro applies a function, provided by user, +to calculate result of the function on taken elements. + +When one of the lists is shorter then elements are "reused" starting +from the beginning. + +The zipEvalf() returns unquoted value [by %unquote()]. +The QzipEvalf() returns quoted value [by %superq()]. + +See examples below for the details. + +The `%QzipEvalf()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%QzipEvalf( + first + ,second + <,function=> + <,operator=> + <,argBf=> + <,argMd=> + <,argAf=> + <,format=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `first` - *Required*, a space separated list of texts. + +2. `second` - *Required*, a space separated list of texts. + +* `function = cat` - *Optional*, default value is `cat`, + a function which will be applied + to corresponding pairs of elements of + the first and the second list. + +* `operator =` - *Optional*, default value is empty, + arithmetic infix operator used with elements + the first and the second list. The first + list is used on the left side of the operator + the second list is used on the right side + of the operator. + +* `argBf =` - *Optional*, default value is empty, + arguments of the function inserted + *before* elements the first list. + If multiple should be comma separated. + +* `argMd =` - *Optional*, default value is empty, + arguments of the function inserted + *between* elements the first list and + the second list. + If multiple should be comma separated. + +* `argAf =` - *Optional*, default value is empty, + arguments of the function inserted + *after* elements the second list. + If multiple should be comma separated. + +* `format=` - *Optional*, default value is empty, + indicates a format which should be used + to format the result, does not work when + the `operator=` is used. + +### EXAMPLES AND USECASES: #################################################### + +See examples in `%zipEvalf()` help for the details. + +--- + +## >>> `%zipEvalf()` macro: <<< ####################### + +The zipEvalf() and QzipEvalf() macro functions +allow to use a function on elements of pair of +space separated lists. + +For two space separated lists of text strings the corresponding +elements are taken and the macro applies a function, provided by user, +to calculate result of the function on taken elements. + +When one of the lists is shorter then elements are "reused" starting +from the beginning. + +The zipEvalf() returns unquoted value [by %unquote()]. +The QzipEvalf() returns quoted value [by %superq()]. + +See examples below for the details. + +The `%zipEvalf()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%zipEvalf( + first + ,second + <,function=> + <,operator=> + <,argBf=> + <,argMd=> + <,argAf=> + <,format=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `first` - *Required*, a space separated list of texts. + +2. `second` - *Required*, a space separated list of texts. + +* `function = cat` - *Optional*, default value is `cat`, + a function which will be applied + to corresponding pairs of elements of + the first and the second list. + +* `operator =` - *Optional*, default value is empty, + arithmetic infix operator used with elements + the first and the second list. The first + list is used on the left side of the operator + the second list is used on the right side + of the operator. + +* `argBf =` - *Optional*, default value is empty, + arguments of the function inserted + *before* elements the first list. + If multiple should be comma separated. + +* `argMd =` - *Optional*, default value is empty, + arguments of the function inserted + *between* elements the first list and + the second list. + If multiple should be comma separated. + +* `argAf =` - *Optional*, default value is empty, + arguments of the function inserted + *after* elements the second list. + If multiple should be comma separated. + +* `format=` - *Optional*, default value is empty, + indicates a format which should be used + to format the result, does not work when + the `operator=` is used. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple concatenation of elements: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%let x = %zipEvalf(1 2 3 4 5 6, q w e r t y); +%put &=x; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Shorter list is "reused": +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%let x = %zipEvalf(1 2 3 4 5 6, a b c); +%put &=x; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Use of the `operator=`, shorter list is "reused": +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%let y = %zipEvalf(1 2 3 4 5 6, 100 200, operator = +); +%put &=y; + +%let z = %zipEvalf(1 2 3 4 5 6 8 9 10, 1 2 3 4 5 6 8 9 10, operator = **); +%put &=z; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Format result: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%let x = %zipEvalf(1 2 3 4 5 6, q w e r t y, format=$upcase.); +%put &=x; + +%put * +%zipEvalf( + ą ż ś ź ę ć ń ó ł +,Ą Ż Ś Ź Ę Ć Ń Ó Ł +,format = $brackets. +) +*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 5.** Use with macrovariables: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%let abc = 10 100 1000; +%put * +%zipEvalf( +%str(1 2 3 4 5 6 7 8 9) +,&abc. +,function = sum +) +*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6.** If one of elements is empty: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put * +%zipEvalf( + abc efg +, +) +*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 7.** Use of the `function=`, shorter list is "reused": +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put * +%zipEvalf( + a b c +,efg +,function = catx +,argBf = %str(,) +,format = $brackets. +) +*; + +%put * +%zipEvalf( + a b c +,efg +,function = catx +,argBf = %str( ) +,format = $upcase. +) +*; + +%put * +%zipEvalf( + %str(! @ # $ [ ] % ^ & * ) +,1 2 3 4 5 6 7 8 9 +,function = catx +,argBf = %str( ) +,format = $quote. +) +*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 8.** Use inside resolve: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data _null_; +z = resolve(' +%zipEvalf( + %nrstr(! @ # $ [ ] % ^ & *) +,1 2 3 4 5 6 7 8 9 +,function = catx +,argBf = %str(.) +,format = $quote. +)'); +put z=; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 9.** Use in data step: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data test; + %zipEvalf( + a b c d e f g + ,1 2 3 4 5 6 7 + ,function = catx + ,argBf = = + ,format = $semicolon. + ) +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 10.** With 9.4M6 hashing() function: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %zipEvalf(MD5 SHA1 SHA256 SHA384 SHA512 CRC32, abcd, function = HASHING); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 11.** Use middle argument: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%let x = %zipEvalf(1 2 3 4 5 6, 2020, argMd=5, function=MDY, format=date11.); +%put &=x; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%functionExists()` macro: <<< ####################### + +The functionExists() macro function tests +if given funcion exists in the SAS session. +The `sashelp.vfunc` view is used. + +See examples below for the details. + +The `%functionExists()` macro executes like a pure macro code. + +The function is a result of cooperation with [Allan Bowe](https://www.linkedin.com/in/allanbowe/) + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%functionExists( + funName +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `funName` - *Required*, the name of the function + existence of which you are testing. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Test if function exists: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %functionExists(HASHING); + + %put %functionExists(COSsinLOG); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%RainCloudPlot()` macro: <<< ####################### + +The RainCloudPlot() macro allow to plot Rain Cloud plots, i.e. pots of +kernel density estimates, jitter data values, and box-and-whiskers plot. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%RainCloudPlot( + DS + ,gr + ,vars + + <,WidthPX=> + <,HeightPX=> + <,boxPlot=> + <,roundFactor=> + <,rainDropSize=> + <,boxPlotSymbolSize=> + <,colorsList=> + <,monochrome=> + <,antialiasMax=> + <,title=> + <,footnote=> + <,catLabels=> + <,xLabels=> + <,catLabelPos=> + <,xLabelPos=> + <,catLabelAttrs=> + <,xLabelAttrs=> + <,formated=> + <,y2axis=> + <,y2axisLevels=> + <,y2axisValueAttrs=> + <,catAxisValueAttrs=> + <,xaxisValueAttrs=> + <,xaxisTickstyle=> + <,sganno=> + <,odsGraphicsOptions=> + <,sgPlotOptions=> + + <,VSCALE=> + <,KERNEL_K=> + <,KERNEL_C=> + + <,cleanTempData=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `DS` - *Required*, name of the dataset from + which variables are to be taken. + +2. `gr` - *Required*, name of the grouping variable. + When more than one variable is specified + separate plots are rendered. + Can be numeric or character. + +3. `vars` - *Required*, name of the aggregated numeric variable. + When more than one variable is specified + separate plots are rendered. + +***Plot related options***: + +* `WidthPX` - *Optional*, default value `1200`. + Total width of the plot in pixels. + +* `HeightPX` - *Optional*, default value `220`. + Partial height of the plot in pixels. + Total height is calculated as `#GROUPS x HeightPX`. + +* `boxPlot` - *Optional*, default value `1`. + Indicates if the Box Plot should be added. + +* `roundFactor` - *Optional*, default value `0.000001`. + Rounding level when calculating maximum value + of the cloud chart. Should be adjusted to data + granularity level, e.g. for data with value + around `1e-8` should be decreased. + +* `rainDropSize` - *Optional*, default value `5px`. + Size of data points in the "rain" plot. + +* `boxPlotSymbolSize` - *Optional*, default value `8px`. + Size of symbols on the box plot. + +* `colorsList` - *Optional*, default value is empty. + List of colours for plotting. + Empty indicates that the default list will be used. + +* `monochrome` - *Optional*, default value `0`. + Indicates if the default list of colours should be gray-scale. + +* `antialiasMax` - *Optional*, default value is empty. + Sets a value to the ODS graphics `ANTIALIASMAX` option. + When empty the value is calculated from data. + +* `title` - *Optional*, default value - see notes below. + Provides a list of titles printed on the plot. + For details see notes below. + +* `footnote` - *Optional*, default value - see notes below. + Provides a list of titles printed on the plot. + For details see notes below. + +* `catLabels` - *Optional*, default value is empty. + List of values for group axix labels (vertical). + When empty a grouping variable name is used. + For details see notes below. + +* `xLabels` - *Optional*, default value is empty. + List of values for data variable axix labels (horizontal). + When empty a data variable name is used. + For details see notes below. + +* `catLabelPos` - *Optional*, default value `DATACENTER`. + Indicates position of the label on group axix (vertical). + Allowed values are `BOTTOM`, `CENTER`, `DATACENTER`, and `TOP`. + +* `xLabelPos` - *Optional*, default value `DATACENTER`. + Indicates position of the label on data axix (horizontal). + Allowed values are `LEFT`, `CENTER`, `DATACENTER`, and `RIGHT`. + +* `catLabelAttrs` - *Optional*, default value is empty. + List of attributes for group axix labels (vertical). + For details see notes below. + +* `xLabelAttrs` - *Optional*, default value is empty. + List of attributes for data variable axix labels (horizontal). + For details see notes below. + +* `formated` - *Optional*, default value `0`. + Indicates if values of the grouping variable should be formated. + +* `y2axis` - *Optional*, default value `1`. + Indicates if the right vertical axix should be displayed. + +* `y2axisLevels` - *Optional*, default value `4`. + Indicates if the number of expected levels of values printed + on the right vertical axix. + +* `y2axisValueAttrs` - *Optional*, default value `Color=Grey`. + Allows to modify Y2 axis values attributes. + +* `catAxisValueAttrs` - *Optional*, default value `Color=Black`. + Allows to modify category (Y) axis values attributes. + +* `xaxisValueAttrs` - *Optional*, default value `Color=Grey`. + Allows to modify X axis values attributes. + +* `xaxisTickstyle` - *Optional*, default value `INSIDE`. + Allows to modify X axis tick style. + Allowed values are `OUTSIDE`, `INSIDE`, `ACROSS`, and `INBETWEEN`. + *For SAS previous to* **9.4M5** *set to missing!* + +* `sganno` - *Optional*, default value is empty. + keeps name of a data set for the `sganno=` option + of the SGPLOT procedure. + +* `sgPlotOptions` - *Optional*, default value is `noautolegend noborder`. + List of additional options values for SGPLOT procedure. + +* `odsGraphicsOptions` - *Optional*, default value is empty. + List of additional options values for `ODS Graphics` statement. + By default only the: `width=`, `height=`, and `antialiasmax=` + are modified. + + +***Stat related options***: + +* `VSCALE` - *Optional*, default value `Proportion`. + Specifies the scale of the vertical axis. + Allowed values are `PROPORTION`, `PERCENT`, and `COUNT`. + `PROPORTION` scales the data in units of proportion of observations per data unit. + `PERCENT` scales the data in units of percent of observations per data unit. + `COUNT` scales the data in units of the number of observations per data unit. + +* `KERNEL_K` - *Optional*, default value `NORMAL`. + Specifies type of kernel function to compute kernel density estimates. + Allowed values are `NORMAL`, `QUADRATIC`, and `TRIANGULAR`. + + +* `KERNEL_C` - *Optional*, default value `1`. + Specifies standardized bandwidth parameter *C* to compute kernel density estimates. + Allowed values are between `0` and `1`, + +***Other options***: + +* `cleanTempData` - *Optional*, default value `1`. + Indicates if temporary data sets should be deleted. + +--- + +### NOTES: ################################################################### + +* Default value of the `title` option is: + `%nrstr(title1 JUSTIFY=C "Rain Cloud plot for &list_g. by " %unquote(&xLabel.);)` + Use the `%str()` or `%nrstr()` macro-function to handle special characters. + The `%unquote()` is used when resolving the parameter. + +* Default value of the `footnote` option is: + `%nrstr(footnote1 JUSTIFY=L COLOR=lightGray HEIGHT=1 "by RainCloudPlot macro from the BasePlus package";)` + Use the `%str()` or `%nrstr()` macro-function to handle special characters. + The `%unquote()` is used when resolving the parameter. + +* The `catLabels` and `xLabels` should be quoted comma separated lists enclosed with brackets, + e.g. `catLabels=("Continent of Origin", "Car Type")`, see Example below. + +* The `catLabelAttrs` and `xLabelAttrs` should be space separated lists of `key=value` pairs, + e.g. `xLabelAttrs=size=12 color=Pink weight=bold`, see Example below. + +* Kernel density estimates and basic statistics are calculated with `PROC UNIVARIATE`. + +* Plot is generated by `PROC SGPLOT` with `BAND`, `SCATTE`, and `POLYGON` plots. + +* After execution the ODS graphics dimension parameters are set to `800px` by `600px`. + +* SAS notes (`NOTE:`) are disabled for the execution time. + +* List of predefined colours is: + `BlueViolet`, `RoyalBlue`, `OliveDrab`, `Gold`, `HotPink`, `Crimson`, + `MediumPurple`, `CornflowerBlue`, `YellowGreen`, `Goldenrod`, `Orchid`, `IndianRed`. + +### BOX-AND-WHISKERS PLOT: ################################################################### + +The box-and-whiskers plot has the following interpretation: +- left vertical bar indicates the minimum, +- left whisker line starts at `max(Q1 - 1.5IQR, minimum)` and ends at lower quartile (Q1), +- diamond indicates mean, +- vertical bar inside of the box indicates median, +- right whisker line starts at upper quartile (Q3) and ends at `min(Q3 + 1.5IQR, maximum)`, +- right vertical bar indicates the maximum. + +With above setup it may happen that +there is a gap between the minimum marker and the beginning of the left whisker +or +there is a gap between the end of the right whisker and the maximum marker. +See examples below. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple Rain Cloud Plot for a `have` dataset: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + + data have; + g = "Aaa"; + do _N_ = 1 to 50; + x = rannor(42); + output; + end; + + g = "Bb"; + do _N_ = 1 to 120; + select (mod(_N_,9)); + when(1,2,3,4,5) x = 0.5*rannor(42)+1; + when(6,7,8) x = 0.5*rannor(42)+3; + otherwise x = 0.5*rannor(42)+5; + end; + output; + end; + + g = "C"; + do _N_ = 1 to 60; + x = 3*rannor(42)+7; + output; + end; + run; + + %RainCloudPlot(have, g, x) + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The output: +![Example 1](./baseplus_RainCloudPlot_Ex1.png) + + + +**EXAMPLE 2.** Rain Cloud plot for `sashelp.cars` dataset + with groups by Origin or Type + for Invoice variables: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + + %RainCloudPlot( + sashelp.cars(where=(Type ne "Hybrid")) + , Origin Type + , Invoice + , HeightPX=300 + , y2axisLevels=3 + , catLabels=("Continent of Origin", "Car Type") + , xLabels="Invoice, [$]" + , xLabelAttrs=size=12 color=Pink weight=bold + ) + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The output: +![Example 2a](./baseplus_RainCloudPlot_Ex2a.png) +![Example 2b](./baseplus_RainCloudPlot_Ex2b.png) + + + +**EXAMPLE 3.** Rain Cloud plot with formatted groups + and annotations. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + + data annotation; + function="text"; + label="This graph is full(*ESC*){sup '2'} of annotations!"; + drawspace="graphpercent"; + rotate=30; + anchor="center"; + textsize=32; + x1=50; + y1=50; + textcolor="red"; + justify="center"; + textweight="bold"; + width=100; + widthunit="percent"; + run; + + proc format; + value system + 1="Windows" + 2="MacOS" + 3="Linux" + ; + run; + + data test; + do system = 1 to 3; + do i = 1 to 50; + x = rannor(123)/system; + output; + end; + end; + format system system.; + run; + + + %RainCloudPlot(test, system, x + , colorslist=CX88CCEE CX44AA99 CX117733 + , formated=1 + , sganno=annotation + , sgPlotOptions=noborder + , WidthPX=1000 + , HeightPX=320 + , catAxisValueAttrs=Color=Green weight=bold + ) + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The output: +![Example 3](./baseplus_RainCloudPlot_Ex3.png) + +--- + +## >>> `%zipLibrary()` macro: <<< ####################### + +The zipLibrary() macro allows to zip content of a SAS library. + +Files can be zipped into a single file (named as the input library) +or into multiple files (named as "dataset.sas7bdat.zip"). +If a file is indexed also the index file is zipped. + +Source files can be deleted after compression. + +Status of compression and processing time is reported. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%zipLibrary( + lib + <,mode=> + <,clean=> + <,libOut=> + <,compression=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `lib` - *Required*, a name of the library to be zipped. + Must be a valid SAS V7, V8, or V9 library. + + +* `mode = S` - *Optional*, default value is `S`, + indicates mode of compression + generates single zip file (`SINGLE/S`) + or multiple files (`MULTI/M`) + +* `clean = 0` - *Optional*, default value is `0`, + should datasets be deleted after zipping? + `1` means *yes*, `0` means *no*. + +* `libOut =` - *Optional*, default value is empty, + output library for a single zip file. + +* `compression =` - *Optional*, default value is `6`, + specifies the compression level + `0` to `9`, where `0` is no compression + and `9` is maximum compression. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Generate data: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + +options dlcreatedir; + libname test1 "%sysfunc(pathname(work))/test1"; + libname test2 "%sysfunc(pathname(work))/test2"; + libname test3 (test1 test2); + libname test4 "%sysfunc(pathname(work))/test4"; +options nodlcreatedir; + +%put %sysfunc(pathname(test3)); +%put %sysfunc(pathname(test4)); + +data + test1.A(index=(model)) + test1.B + test2.C + test2.D(index=(model make io=(invoice origin))) +; + set sashelp.cars; +run; + +data test1.B2 / view=test1.B2; + set test1.B; + output; + output; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Zip content of test3 library + into the same location in one zip file: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%zipLibrary(test3) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Zip content of test3 library + into the same location in multiple zip files: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%zipLibrary(test3, mode=MULTI) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Zip content of test3 library + with maximum compression level + into different location in one zip file + and delete source files: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%zipLibrary(test3, clean=1, libOut=test4, compression=9) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%unzipLibrary()` macro: <<< ####################### + +The unzipLibrary() macro allows to unzip content of a SAS library. +It is a *counterpart* to the `%zipLibrary()` macro and is *not* intended to work +with zip files generated by other software (though it may in some cases). + +Files can be unzipped from a single file +or from multiple files (named e.g. "dataset.sas7bdat.zip"). +If a file is indexed also the index file is unzipped. + +Source files can be deleted after decompression. + +Status of decompression and processing time is reported. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%unzipLibrary( + path + <,zip=> + <,mode=> + <,clean=> + <,libOut=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `path` - *Required*, a path pointing to zipped file(s) location. + +* `zip =` - *Optional*, When `mode=S` a name of the + zip file containing SAS files to be unzipped. + +* `mode = S` - *Optional*, default value is `S`, + indicates mode of decompression + read from a single zip file (`SINGLE/S`) + or from multiple files (`MULTI/M`) + +* `clean = 0` - *Optional*, default value is `0`, + should zip files be deleted after unzipping? + `1` means *yes*, `0` means *no*. + +* `libOut =` - *Optional*, default value is empty, + output library for a single zip file + decompression. + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Generate data: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + +options dlcreatedir; + libname test1 "%sysfunc(pathname(work))/test1"; + libname test2 "%sysfunc(pathname(work))/test2"; + libname test3 (test1 test2); + libname test4 "%sysfunc(pathname(work))/test4"; +options nodlcreatedir; + +%put %sysfunc(pathname(test3)); +%put %sysfunc(pathname(test4)); + +data + test1.A(index=(model)) + test1.B + test2.C + test2.D(index=(model make io=(invoice origin))) +; + set sashelp.cars; +run; + +data test1.B2 / view=test1.B2; + set test1.B; + output; + output; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Use data from Example 1. + First zip content of the `test3` library + to `test4` location into one zip file + and delete source files. + Next unzip `test3.zip` library into the + `test4` location and delete the zip file. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%zipLibrary(test3, clean=1, libOut=test4) + + +%unzipLibrary(%sysfunc(pathname(test4)), zip=test3, clean=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Use data from Example 1. + First zip content of the `test1` library + into multiple zip files and delete source files. + Next unzip `*.zip` files in `test1` + location and delete zipped files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%zipLibrary(test1, mode=M, clean=1) + + +%unzipLibrary(%sysfunc(pathname(test1)), mode=M, clean=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** First zip content of the `sashelp` library + into `work` library. + Next unzip `sashelp.zip` file in `work` + location and delete zip file. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%zipLibrary(sashelp, mode=S, clean=0, libOut=work) + + +%unzipLibrary(%sysfunc(pathname(work)), zip=sashelp, mode=S, clean=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%unzipArch()` macro: <<< ####################### + +The unzipArch() macro allows to unzip content of a ZIP archive. +Macro is OS independent, the `XCMD` option is not required. + +The `dlCreateDir` option is used under the hood. + +Content of unzipped archive can be listed in the log. + +Source files can be deleted after decompression. +Errors of decompression and are reported. If any occur +the deletion is suspended. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%unzipArch( + archName + <,path=> + <,target=> + <,list=> + <,clean=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `archName` - *Required*, name of the ZIP archive to be extracted. + Name should be full, i.e., with the extension. + +* `path=` - *Optional*, a path pointing to zipped file location. + The path should be provided unquoted. + Default value is `WORK` location. + +* `target=` - *Optional*, a path pointing to target location where + files will be extracted. + The path should be provided unquoted. + Default value is `WORK` location. + +* `list = 0` - *Optional*, default value is `0`, + indicates if zip content should be listed in the log. + `1` means *yes*, `0` means *no*. + +* `clean = 0` - *Optional*, default value is `0`, + indicates if zip file should be deleted after unzipping. + `1` means *yes*, `0` means *no*. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Unzip compressed archive. Example requires the `basePlus` package. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + +filename arch ZIP "%workPath()/testArch.zip"; + +data _null_; + file arch(abc/test1.txt); + put "text for test file 1"; +data _null_; + file arch(abc/subdir/test2.txt); + put "text for test file 2"; +data _null_; + file arch(abc/subdir/test3.txt); + put "text for test file 3"; +run; + +%unzipArch( + testArch.zip +, path = %workPath() +, target = %workPath() +, list=1 +); + +%unzipArch( + testArch.zip +, path = %workPath() +, target = %workPath() +, clean=1 +); + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## >>> `%LDSN()` macro: <<< ####################### + +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: + +Good friend of mine, who didn't use SAS for quite some time, +told me that he lost a few hours for debugging because +he forgot that the SAS dataset name limitation is 32 bytes. + +I replied that it shouldn't be a problem to do a workaround +for this inconvenience with a macro and the `MD5()` hashing function. + +I said: *The macro should take an "arbitrary string" for a dataset +name, convert it, with help of `MD5()`, to a hash digest, and +create a dataset with an "artificial" `hex16.` formated name.* + +Starting with something like this: + +~~~~~~~~~~~~~~~~~~~~~~~sas +data %LDSN(work. peanut butter & jelly with 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; +~~~~~~~~~~~~~~~~~~~~~~~ + +the macro would do: + +~~~~~~~~~~~~~~~~~~~~~~~sas +%sysfunc(MD5(peanut butter & jelly with a hot-dog in [a box] and s*t*a*r*s), hex16.) +~~~~~~~~~~~~~~~~~~~~~~~ + +and (under the hood) return and execute the following code: + +~~~~~~~~~~~~~~~~~~~~~~~sas +data work.DSN_41D599EF51FBA58_(drop = sex rename=(name=first_name) where = (age in (12,13,14))) ; + set sashelp.class; +run; +~~~~~~~~~~~~~~~~~~~~~~~ + +Also in the next data step user should be able to do: + +~~~~~~~~~~~~~~~~~~~~~~~sas +data my_next_data_step; + set %DSN(work. peanut butter & jelly with a hot-dog in [a box] and s*t*a*r*s); +run; +~~~~~~~~~~~~~~~~~~~~~~~ + +and work without the "dataset-name-length-limitation" issue. + +--- + +See examples below for the details. + +The `%LDSN()` macro executes like a pure macro code. + +**Known "Limitations":** + +- dataset name _cannot_ contain dots (`.`) since they are used as separators! + +- dataset name _cannot_ contain round brackets(`(` and `)`) since they are used as separators + (but `[]` 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(work.test)`, `%ldsn( work.test)`, `%ldsn(work.test )`, + `%ldsn(work .test)`, `%ldsn(work. test)`, `%ldsn(work . test)`. + +- macro calls of the form: + `data %LDSN(); run;`, `data %LDSN( ); run;`, `data %LDSN( . ); run;` or even + `data %LDSN( . (keep=x)); run;` are resolved to empty string, so the result is + equivalent to `data; run;` + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%LDSN( + arbitrary text string (in line with limitations) +) +~~~~~~~~~~~~~~~~~~~~~~~ + +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.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +options nomprint source nomlogic nosymbolgen ls = max ps = max; + +data %LDSN( work. peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s (drop = sex rename=(name=first_name) where = (age in (12,13,14))) ); + set sashelp.class; +run; + +proc print data = %LDSN( work. peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s ); +run; + +data MyNextDataset; + set %LDSN( work. peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s ); + where age > 12; +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()` macro works differently than the `%LDSN()` macro. + +The `%LDSN()` macro assumes that *both* libname and dataset options *are* +be passed as elements **inside** the macro argument, together with the data set name. 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()` macro, in contrary, assumes that both libname and dataset options are +passed **outside** the macro parameter, 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 overcomes some limitations the LDSN has. + +The **additional** feature of the `%LDSNM()` is that when the macro is called, +a global macrovariable is created. +The macro variable name is the text of the hashed data set name. +The macro variable value is the text of the unhashed data set name (i.e. 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 macro variable with name `DSN_BF1F8C4D6495B34A_` and 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 considered as *"only dataset name"*, i.e. the macro does not +assume it contains library as prefix or data set options as suffix. +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. +Supported by LVarNmLab() macro function which allows to remember "user names" in labels. + +The motivation for the macro was similar to that for the LDSN() macro. + +--- + +See examples below for the details. + +The `%LVarNm()` macro executes like a pure macro code. + +**Known "Limitations":** + +- variable name _cannot_ contain unpaired quotes (`'` and `"`), + text: `a "hot-dog"` is ok, but `John's dog` is not! + +**Behaviour:** + +- variable name text is *converted to upcase* + +- variable name text *leading and trailing spaces are ignored*, + e.g. the following will give the same hash digest: + `%LVarNm(test)`, `%LVarNm( test)`, `%LVarNm(test )`. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%LVarNm( + arbitrary text string (in line with limitations) +) +~~~~~~~~~~~~~~~~~~~~~~~ + +--- + + +### EXAMPLES AND USE CASES: #################################################### + +**EXAMPLE 1.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +options ls=max; +data test; + %LVarNmLab( peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s ) + + do %LVarNm( peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s ) = 1 to 10; + + y = 5 + %LVarNm( peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s ) * 17; + output; + end; +run; + +data test2; + set test; + where %LVarNm( peanut butter & jelly with a "Hot-Dog" in [a box], popcorn, and s*t*a*r*s ) < 5; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data test3; + %LVarNmLab() = 17; + + %LVarNm() = 17; + + %LVarNm( ) = 42; + + %LVarNm( ) = 303; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data test3; + %LVarNm(test) = 1; + + %LVarNm( test) = 2; + + %LVarNm(test ) = 3; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data test4; + array X[*] %LVarNm(some strange! name)_0 - %LVarNm(some strange! name)_10; + + do i = lbound(X) to hbound(X); + X[i] = 2**(i-1); + put X[i]=; + end; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## >>> `%LVarNmLab()` macro: <<< ####################### + +The LVarNmLab() macro function supports LVarNm() and allows to remember "user names" in labels. + +The motivation for the macro was similar one as for the LDSN() macro. + +--- + +See examples in LVarNm() documentation for the details. + +The `%LVarNmLab()` macro executes like a pure macro code. + +**Known "Limitations":** + +- variable name _cannot_ contain unpaired quotes (`'` and `"`), + text: `a "hot-dog"` is ok, but `John's dog` is not! + +**Behaviour:** + +- variable name text is *converted to upcase* + +- variable name text *leading and trailing spaces are ignored*, + e.g. the following will give the same hash digest: + `%LVarNmLab(test)`, `%LVarNmLab( test)`, `%LVarNmLab(test )`. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%LVarNmLab( + arbitrary text string (in line with limitations) +) +~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%bpPIPE()` macro: <<< ####################### + +The bpPIPE() [Base Plus PIPE] macro executes OS command +and print to the log output of the execution. + +Under the hood it uses `_` filename reference to PIPE device. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%bpPIPE( ) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +* **NO Arguments** - Everything inside brackets is treated as an OS command. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** List, to the log, content of D and C drives: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %bpPIPE(D: & dir & dir "C:\") +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** List, to the log, content of `home` directory: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %bpPIPE(ls -halt ~/) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%dirsAndFiles()` macro: <<< ####################### + +The `%dirsAndFiles()` macro allows to extract info about all files +and subdirectories of a given `root` directory. + +The extracted info may be just a list of files and subdirectories or, if +the `details=` parameter is set to 1, additional operating system information +is extracted (information is OSS dependent and gives different results for Linux +and for Windows) + +The extracted info can be narrowed down to files (`keepFiles=1`) or to +directories (`keepDirs=1`) if need be. + +The extracted info can be presented in wide or long format (`longFormat=1`). + +The extracted info for files can be narrowed down to only files with particular +extension, for example: `fileExt=sas7bdat`. + +The extracted info can be narrowed down maximal path depth +by setting up the `maxDepth=` parameter. + +See examples below for the details. + +### REFERENCES: ################################################################### + +The macro is based on Kurt Bremser's "*Talking to Your Host*" article +presented at WUSS 2022 conference. + +The article is available [here](https://communities.sas.com/t5/SAS-User-Groups-Library/WUSS-Presentation-Talking-to-Your-Host/ta-p/838344) +and also as an additional content of this package. +The paper was awarded the "Best Paper Award - Programming". + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles( + root + <,ODS=> + <,details=> + <,keepDirs=> + <,keepFiles=> + <,longFormat=> + <,fileExt=> + <,maxDepth=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `root` - *Required*, path to be searched + for information. + +* `ODS=work.dirsAndFilesInfo` - *Optional*, output data set, + name of a dataset to store information. + +* `details=0` - *Optional*, indicates if detailed info + will be collected, `1` = yes, `0` = no. + +* `keepDirs=1` - *Optional*, indicates if directories info + will be collected, `1` = yes, `0` = no. + +* `keepFiles=1` - *Optional*, indicates if files info + will be collected, `1` = yes, `0` = no. + +* `longFormat=0` - *Optional*, indicates if output be + in long format, `1` = yes, `0` = no. + +* `fileExt=` - *Optional*, if not missing then indicates + file extension to filter out results. + +* `maxDepth=0` - *Optional*, if not zero then indicates + maximum depth of search in the root path. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Get list of files and directories: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(C:\SAS_WORK\,ODS=work.result1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Get detailed info: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(C:\SAS_WORK\,ODS=work.result2,details=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Get only files info: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(C:\SAS_WORK\,ODS=work.result3,keepDirs=0) + +%dirsAndFiles(C:\SAS_WORK\,ODS=work.result5,keepDirs=0,details=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Get only directories info: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(C:\SAS_WORK\,ODS=work.result4,keepFiles=0) + +%dirsAndFiles(C:\SAS_WORK\,ODS=work.result6,keepFiles=0,details=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 5.** Filter out by `sas` extension: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(~/,ODS=work.result7,fileExt=sas) + +%dirsAndFiles(~/,ODS=work.result8,fileExt=sas,details=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6.** Keep result in the long format: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(~/,ODS=work.result9,details=1,longFormat=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 7.** Get info for maximum depth of 2: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(C:\SAS_WORK\,ODS=work.result10,details=1,maxDepth=2) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 8.** How locked/unavailable files are handled: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(%sysfunc(pathname(WORK)),ODS=work.result11,details=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 9.** Not existing directory: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%dirsAndFiles(%sysfunc(pathname(WORK))/noSuchDir,ODS=work.result12,details=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%repeatTxt()` macro: <<< ####################### + +The repeatTxt() macro function allows to repeat `n` +times a `text` string separated by string `s=`. + +The repeatTxt() returns unquoted value [by %unquote()]. + +See examples below for the details. + +The `%repeatTxt()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%repeatTxt( + text + <,n> + <,s=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `text` - *Required*, a text to be repeated. + +2. `n` - *Required/Optional*, the number of repetitions. + If missing then set to `1`; + +* `s = %str( )` - *Optional*, it is a separator between + repeated elements. Default value is space. +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple repetition of dataset name: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +options mprint; +data work.test5; + set + %repeatTxt(sashelp.cars, 5) + ; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Simple repetition of data step: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +options mprint; +%repeatTxt(data _null_; set sashelp.cars; run;, 3) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** "Nice" output: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Macroquote a text with commas: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%repeatTxt( + %str(proc sql; create table wh as select weight,height from sashelp.class; quit;) + ,3 +) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 5.** Empty `n` repeats `text` one time: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +options mprint; +data work.test1; + set + %repeatTxt(sashelp.cars) + ; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 6.** Dynamic "formatting": +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%macro printWork(); + %let work=%sysfunc(pathname(work)); + %put +%repeatTxt(~,%length(&work.)+5,s=)+; + %put {&=work.}; + %put +%repeatTxt(~,%length(&work.)+5,s=)+; +%mend printWork; + +%printWork() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%repList()` macro: <<< ####################### + +The repList() macro function allows to repeat `T` +times elements of a `L` list, possibly `E` times each element, +separated by string `S`. + +See examples below for the details. + +The `%repList()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%repList( + list + <,times=> + <,each=> + <,lenghtOut=> + <,sep=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `list` - *Required*, a list of elements to be repeated. + List can be space or comma separated. + Elements can be in quotes. + For comma separated list add brackets + e.g., `%repList((A,B,C,D),times=5)`. + The list separators are: `<{[( ,;)]}>`. + +* `times=` - *Optional*, An integer indicating + the number of repetitions. + By default set to `1`. + + +* `each=` - *Optional*, A list of integers indicating + the number of repetitions of each element of the list + e.g., for a list `A B C` and the `each=2 4` the result + is `A A B B B B C C`. If the number of integers is less + then the length of the list values are recycled from + the beginning. + By default set to `1`. + +* `lenghtOut=` - *Optional*, An integer indicating + after what the number of repetitions process will stop. + By default set to `0` which means "do not stop". + +* `sep=` - *Optional*, it is a separator printed between + repeated elements. Mnemonics for *space* is `s`, + for *comma* is `c`, and for semicolon in `q`. + Default value is a single space. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple repetition of all elements: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %repList((A,B,C,D), times=3); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Simple repetition of each element: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %repList(("A",'B',"C",'D'), each=3); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Simple repetition with a separator: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %repList(A10;B20;C30, times=3, each=2, sep=Q); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Recycle elements up to 8 with a comma as a separator: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %repList(1 2 3, lenghtOut=8, sep=c); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 5.** Separate number of repetitions for each element: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put [%repList([D][C][B][A], each = 2 3 5 7, sep=] [)]; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 6.** "ASCII art" butterflies: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put {>%repList(! $ |, times = 2, each =2 1, sep=<} ... {>)<}; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 7.** Data repeating: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +data A; + x=17; +data B; + x=42; +data C; + x=303; +run; + +data Times2_A10B11C12; + set + %repList(A B C, times = 2, each =10 11 12) + ; +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +--- + + +## >>> `%intsList()` macro: <<< ####################### + +The intsList() macro function allows to print a list of +integers starting from `start` up to `end` incremented by `by` +and separated by `sep=`. + +If `start`, `end` or `by` are non-integers the are converted to integers. + +See examples below for the details. + +The `%intsList()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%intsList( + start + <,end> + <,by> + <,sep=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `start` - *Required*, the first value of the list. + If `end` is missing then the list is generated + from 1 to `start` by 1. + +2. `end` - *Required/Optional*, the last value of the list. + +3. `by` - *Required/Optional*, the increment of the list. + If missing then set to `1`. + *Cannot* be equal to `0`. + +* `s = %str( )` - *Optional*, it is a separator between + elements of the list. Default value is space. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple list of integers from 1 to 10 by 1: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %intsList(10); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Ten copies of `sashelp.class` in `test11` to `test20`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data + %zipEvalf(test, %intsList(11,20)) + ; + set sashelp.class; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Non-integers are converted to integers, the list is `1 3 5`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %intsList(1.1,5.2,2.3); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** A list with a separator: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %intsList(1,5,2,sep=+); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%letters()` macro: <<< ####################### + +The letters() macro function allows to print a list of Roman +letters starting from `start` up to `end` incremented by `by`. +The letters list can be uppercases or lowercase (parameter `c=U` or `c=L`), +can be quoted (e.g. `q=""` or `q=[]`), and can be separated by `s=`. + +Values of `start`, `end`, and `by` have to be integers in range between 1 ad 26. + +See examples below for the details. + +The `%letters()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%letters( + range + <,c=> + <,q=> + <,s=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `range` - *Required*, letters selector in form `start:end:by`. + Lists letters from `start` to `end` by `by`. + Values of `start`, `end`, and `by` are separated by + colon and must be between 1 ad 26. + If value is outside range it is set to + `start=1`, `en=26`, and `by=1`. If `end` is missing + then is set to value of `start`. + If `end` is smaller than `start` list is reversed + +* `c = U` - *Optional*, it is a lowercase letters indicator. + Select `L` or `l`. Default value is `U` for upcase. + +* `q = ` - *Optional*, it is a quite around elements of the list. + Default value is empty. Use `%str()` for one quote symbol. + If there are multiple symbols, only the first and the + second are selected as a preceding and trailing one, + e.g. `q=[]` gives `[A] [B] ... [Z]`. + +* `s = %str( )` - *Optional*, it is a separator between + elements of the list. Default value is space. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Space separated list of capital letters from A to Z: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26:1); + + %put %letters(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** First, thirteenth, and last letter: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1) %letters(13) %letters(26); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Every third lowercase letter, i.e. `a d g j m p s v y`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26:3,c=L); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Lists with separators: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26:2,s=#); + %put %letters(1:26:3,s=%str(;)); + %put %letters(1:26:4,s=%str(,)); + %put %letters(1:26,s=); + %put %letters(1:26,s==); + %put %letters(1:26,s=/); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 5.** Every second letter with quotes: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26:2,q=%str(%')); + %put %letters(2:26:2,q=%str(%")); + + %put %letters(1:26:2,q=''); + %put %letters(2:26:2,q=""); + + %put %letters(1:26:2,q=<>); + %put %letters(2:26:2,q=\/); + + %put %letters(1:26:2,q=()); + %put %letters(2:26:2,q=][); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6.** Mix of examples 4, 5, and 6: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26,c=L,q='',s=%str(, )); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 7.** If `end` is smaller than `start` list is reversed: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(26:1:2,q=''); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%splitDSIntoBlocks()` macro: <<< ####################### + +The splitDSIntoBlocks() macro allows to split the `set` dataset into blocks +of size `blockSize` in datasets: `prefix1` to `prefixN`. + +The last dataset may have less observations then the `blockSize`. + +Macro covers `BASE` engine (`v9`, `v8`, `v7`, `v6`) and `SPDE` engine datasets. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%splitDSIntoBlocks( + blockSize + <,set> + <,prefix> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `blockSize` - *Required*, the size of the block of data, + in other words number of observations in + one block of split data. + Block size must be positive integer. + +2. `set` - *Required/Optional*, the name of the dataset to split. + If empty then `&syslast.` is used. + +3. `prefix` - *Required/Optional*, the name-prefix for new datasets. + If missing then set to `part`. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Split `sashelp.class` into 5 elements datasets ABC1 to ABC4: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %splitDSIntoBlocks(5,sashelp.class,ABC) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** By default splits the `_last_` dataset into `part1` to `partN` datasets: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data lastData; + set sashelp.cars; + run; + + %splitDSIntoBlocks(123) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Works with `SPDE` engine too: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options dlcreatedir; + libname test "%sysfunc(pathname(work))/testSPDE"; + libname test; + libname test SPDE "%sysfunc(pathname(work))/testSPDE"; + + data test.test; + set sashelp.cars; + run; + + %splitDSIntoBlocks(100,test.test,work.spde) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%splitDSIntoParts()` macro: <<< ####################### + +The splitDSIntoParts() macro allows to split the `set` dataset into `parts` parts +of approximately `NOBS/parts` size in datasets: `prefix1` to `prefixN`. + +The splitDSIntoParts() macro internally runs the splitDSIntoBlocks() macro. + +Macro covers `BASE` engine (`v9`, `v8`, `v7`, `v6`) and `SPDE` engine datasets. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%splitDSIntoParts( + parts + <,set> + <,prefix> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `parts` - *Required*, the number of parts to split data into. + Number of parts must be positive integer. + +2. `set` - *Required/Optional*, the name of the dataset to split. + If empty then `&syslast.` is used. + +3. `prefix` - *Required/Optional*, the name-prefix for new datasets. + If missing then set to `part`. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Split `sashelp.cars` into 7 parts: datasets carsInParts1 to carsInParts7: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %splitDSIntoParts(7,sashelp.cars, carsInParts) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** By default splits the `_last_` dataset into `part1` to `part3` datasets: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data lastData; + set sashelp.cars; + run; + + %splitDSIntoBlocks(3) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Works with `SPDE` engine too: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options dlcreatedir; + libname test "%sysfunc(pathname(work))/testSPDE"; + libname test; + libname test SPDE "%sysfunc(pathname(work))/testSPDE"; + + data test.test; + set sashelp.cars; + run; + + %splitDSIntoParts(3,test.test,work.spde) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%filePath()` macro: <<< ####################### + +The filePath() macro function returns path to a file, +it is a wrapper to `pathname()` function for files. + +See examples below for the details. + +The `%filePath()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%filePath( + fileref +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `fileref` - *Required*, a fileref from the `filename` statement. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Return path to temporary file: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + filename f temp; + %put %filePath(f); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%libPath()` macro: <<< ####################### + +The libPath() macro function returns path to a library, +it is a wrapper to `pathname()` function for libraries. + +See examples below for the details. + +The `%libPath()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%libPath( + libref +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `libref` - *Required*, a libref from the `libname` statement. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Return path to `WORK` library: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %libPath(WORK); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Return path to `SASHELP` library: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %libPath(SASHELP); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%workPath()` macro: <<< ####################### + +The workPath() macro function returns path to the `WORK` library, +it is a wrapper to `pathname("work", "L")` function. + +See examples below for the details. + +The `%workPath()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%workPath() +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +*) No arguments. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Create new library inside `WORK` library: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options dlCreateDir; + libname NEW "%workPath()/new"; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%date()` macro: <<< ####################### + +The date() macro function is a "lazy typer" wrapping up `%sysfunc(date())`. + +See examples below for the details. + +The `%date()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%date() +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + + No arguments. + +--- + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Get value of `date()`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %date(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + + +## >>> `%today()` macro: <<< ####################### + +The today() macro function is a "lazy typer" wrapping up `%sysfunc(today())`. + +See examples below for the details. + +The `%today()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%today() +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + + No arguments. + +--- + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Get value of `today()`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %today(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + + +## >>> `%time()` macro: <<< ####################### + +The time() macro function is a "lazy typer" wrapping up `%sysfunc(time())`. + +See examples below for the details. + +The `%time()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%time() +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + + No arguments. + +--- + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Get value of `time()`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %time(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + + +## >>> `%datetime()` macro: <<< ####################### + +The datetime() macro function is a "lazy typer" wrapping up `%sysfunc(datetime())`. + +See examples below for the details. + +The `%datetime()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%datetime() +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + + No arguments. + +--- + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Get value of `datetime()`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %datetime(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%monthShift()` macro: <<< ####################### + +The monthShift() macro is a utility macro +which allows to shift "year-month" period by +a given number of "periods" (months). + +The result is in the `YYYYMM` format but can be altered. + +See examples below for the details. + +The `%monthShift()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%monthShift( + < Y> + <,M> + <,shift> + <,ofmt=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `Y` - *Optional*, a year from which counting starts. + If null the value is set to *system year*. + +2. `M` - *Optional*, a month from which counting starts. + If null the value is set to `1`. Can be a number + (`1` to `12`) or a name (`June`, `OCTOBER`) or + a three letters short (`JAN`, `apr`). + +3. `shift` - *Optional*, number of periods to shift. + If null the value is set to `0`. + Positive value shifts to the "future", + negative value shifts to the "past", + Can be an expression (e.g. `1+2*3`, see examples). + +* `ofmt=YYMMn6.` - *Optional*, it is a format name used to + display the result. Default value is `YYMMn6.` + See examples. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Shift one up and one down: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put + Past: %monthShift(2023, 1, -1) + Current: %monthShift(2023, 1 ) + Future: %monthShift(2023, 1, +1) +; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Shift by expression: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %let n = 2; + %put + %monthShift(2023, 1, +1 + &n.*3) + ; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Shift with default values: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %monthShift(); + %put %monthShift(2023); + %put %monthShift(2023,Jan); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Shift with months names: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put + %monthShift(2023,Jan,-1) + %monthShift(2023,Feb,-2) + %monthShift(2023,Mar,-3) + %monthShift(2023,Apr,-4) + %monthShift(2023,May,-5) + %monthShift(2023,Jun,-6) + %monthShift(2023,Jul,-7) + %monthShift(2023,Aug,-8) + %monthShift(2023,Sep,-9) + %monthShift(2023,Oct,-10) + %monthShift(2023,Nov,-11) + %monthShift(2023,Dec,-12) + ; + + %put + %monthShift(2023,January,12) + %monthShift(2023,February,11) + %monthShift(2023,March,10) + %monthShift(2023,April,9) + %monthShift(2023,May,8) + %monthShift(2023,June,7) + %monthShift(2023,July,6) + %monthShift(2023,August,5) + %monthShift(2023,September,4) + %monthShift(2023,October,3) + %monthShift(2023,November,2) + %monthShift(2023,December,1) + ; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 5.** Play with formatting: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put + %monthShift(2023, 1, +1 ) + %monthShift(2023, 1, +1, ofmt=yymm7. ) + %monthShift(2023, 1, +1, ofmt=yymmd7.) + %monthShift(2023, 1, +1, ofmt=yymms7.) + ; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6.** Read monthly data with `noDSNFERR` option: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data + A202210 A202211 A202212 + A202301 A202302 A202303 + A202304 A202305 A202306 + A202307 A202308 A202309 + ; + set sashelp.class; + run; + + + options noDSNFERR; + data ALL; + set + A%monthShift(2023, 9, -12) - A%monthShift(2023, 9) + ; + run; + options DSNFERR; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + + +## >>> `%translate()` macro: <<< ####################### + +The translate() macro function allows to replace bytes with bytes in text string. + +See examples below for the details. + +The `%translate()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%translate( + string + ,from + ,to +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `string` - *Required*, string to modify. + +2. `from` - *Required*, list of bytes to be replaced with + corresponding bytes from `to`. + +3. `to` - *Required*, list of bytes replacing + corresponding bytes from `from`. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Replace quotes and commas with apostrophes and spaces: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %translate(%str("A", "B", "C"),%str(%",),%str(%' )); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Unify all brackets; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %translate(%str([A] {B} (C) ),{[(<>)]},(((())))); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Replace all digits with `*`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %translate(QAZ1WSSX2EDC3RFV4TGB5YHN6UJM7IK8OL9P0,1234567890,**********); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Letters change: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %translate(%str(A=B),AB,BA); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%tranwrd()` macro: <<< ####################### + +The tranwrd() macro function allows to replace substrings +with other substrings in text string. + +Returned string is unquoted by `%unquote()`. + +See examples below for the details. + +The `%tranwrd()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%tranwrd( + string + ,from + ,to + <,repeat> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `string` - *Required*, string to modify. + +2. `from` - *Required*, substring replaced with + corresponding string from `to`. + +3. `to` - *Required*, substring replacing + corresponding substring from `from`. + +4. `repeat` - *Optional*, number of times the replacing + should be repeated, default is 1. + Useful while removing multiple adjacent + characters, e.g. compress all multiple + spaces (see example 2). +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple text replacement: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %tranwrd(Miss Joan Smith,Miss,Ms.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Delete multiple spaces; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %tranwrd(%str(A B C),%str( ),%str( ),5); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Remove substring: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %tranwrd(ABCxyzABCABCxyzABC,ABC); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## >>> `%findDSwithVarVal()` macro: <<< ####################### + +The findDSwithVarVal() macro searches for all +datasets (available for a given session) containing +a variable of a given value. + +The value search is case sensitive - but can be altered with `IC=` parameter. +The value search keeps leading blanks - but can be altered with `TB=` parameter. +The value search compares full value - but can be altered with `CTS=` parameter. + +The default variable type is `char`, the `type=` parameter allows +to change it (possible values are `char` and `num`), the parameter is case sensitive. + +Only datasets are searched, views are not included. + +During the process two temporary datasets named: +`WORK._` (single underscore) and `WORK.__` (double underscore) +are generated. The datasets are deleted at the end of the process. + +By default search results are stored in the `WORK.RESULT` dataset. +Name of the dataset can be altered with `result=` parameter. +The dataset with result contains two variables: +`datasetName` - names of datasets, +`firstObservation` - the firs occurrence of the value. + +See examples below for the details. + +The `%findDSwithVarVal()` macro does not execute as a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%findDSwithVarVal( + variable + ,value + <,type=> + <,ic=> + <,tb=> + <,cts=> + <,lib=> + <,result=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `variable` - *Required*, name of variable to be searched. + +2. `value` - *Required*, the value to be searched. + +*. `type` - *Optional*, default value is `char`. + Indicates which type is the searched value. + Possible values are `char` and `num`, + the parameter is case sensitive. + +*. `ic` - *Optional*, "Ignore Cases", default value is `0`. + Indicates should the search ignore cases of the text values. + Possible values are `0` and `1`. + +*. `tb` - *Optional*, "Trim Blanks", default value is `0`. + Indicates should the search trim leading and trailing + blanks of the text values. + Possible values are `0` and `1`. + +*. `cts` - *Optional*, "Compare To Shorter", default value is `0`. + IF set to `1` execute value comparison as `=:` for the text value. + Possible values are `0` and `1`. + See examples. + +*. `lib` - *Optional*, default value is missing. + If not empty narrows the search to a particular library. + +*. `result` - *Optional*, default value is `WORK.RESULT`. + Is the name of the dataset with results. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Search variable `NAME` containing value `John`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %findDSwithVarVal(name, John) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Search numeric variable `AGE` containing value `14`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %findDSwithVarVal(age, 14, type=num) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Search numeric variable `SCORE` with missing value: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data TEST; + score=17; output; + score=42; output; + score=. ; output; + run; + + %findDSwithVarVal(score, ., type=num, result=WORK.MissingScore) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Search library `WORK` for variable `NAME` starting with value `Jo` + ignoring cases and trimming blanks from value: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data A; + name="Joanna"; + data B; + name="john"; + data C; + name=" Joseph"; + data D; + name=" joe"; + run; + + %findDSwithVarVal(name, Jo, ic=1, tb=1, cts=1, lib=WORK) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%getTitle()` macro: <<< ####################### + +The getTitle() macro extract text of titles or footnotes +into a delimited list. + +Titles/footnotes numbers can be selected with the `number` argument. +Only the text of a title or footnote is extracted. + +Author of the original code is: Quentin McMullen (`qmcmullen.sas@gmail.com`). + +See examples below for the details. + +The `%getTitle()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%getTitle( + < number> + <,type=> + <,dlm=> + <,qt=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `number` - *Optional*, default value is empty, + indicates numbers of titles to be extracted. + Space separated list is expected. + If empty or `_ALL_` extract all non-missing. + +*. `type` - *Optional*, default value is `T`. + Indicates which type is the searched. + `T` fro title, `F` for footnote. + +*. `dlm` - *Optional*, "DeLiMiter", default value is `|` (pipe). + Possible values are: `| \ / , . ~ * # @ ! + - _ : ?` + or `s` for space, `c` for comma, `d` for semicolon. + +*. `qt` - *Optional*, "QuoTes", default value is empty. + Use `%str()` for single quote symbol (e.g. `%str(%")`). + If there are multiple symbols, only the first and the + second are selected as a leading and trailing one, + e.g. `qt=""` gives `"title1 text" "title2 text" ... `. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Get titles in different forms: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + title1 j=c "Hi Roger" ; + title2 j=l "Good Morning" ; + title3 "How are you?" ; + title4 ; + title5 "Bye bye!" ; + + %put %GetTitle() ; + + %put %GetTitle(1 3,dlm=c, qt=[]) ; + + %put %GetTitle(2:4,dlm=s, qt='') ; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Get footnotes in different forms: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + footnote1 "First little footnote"; + footnote2 "Second little footnote"; + footnote3 "Third little footnote"; + + %put %GetTitle(1 2,type=f,dlm=s, qt="") ; + %put %GetTitle(2 3,type=f,dlm=c, qt='') ; + %put %GetTitle(1 3,type=f,dlm=d, qt=[]) ; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%mInclude()` macro: <<< ####################### + +The mInclude() macro is a macrolanguage version of the SAS `%include` statement. +But it allows for "embedding any code anywhere into SAS programs". + +Macro was inspired by *Leonid Batkhan* and his blog post: + +"Embedding any code anywhere into SAS programs" from May 30, 2023. + +Link: `https://blogs.sas.com/content/sgf/2023/05/30/embedding-any-code-anywhere-into-sas-programs/` + +The implementation presented, in contrary to inspiration source, is +based on the `doSubL()` function and a list of global +macrovariables of the form `______` (six underscores and a number). + +See examples below for the details. + +The `%mInclude()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%mInclude( + < f> + <,source=> + <,lrecl=> + <,symdel=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `f` - *Required*, a SAS `fileref` or a **quoted** path + to the included file. + +*. `source=0` - *Optional*, default value is `0`. + Set to `1` if the source should be printed in the log. + +*. `lrecl=32767` - *Optional*, default value is `32767`. + Sets the `lrecl` value for the file width. + +*. `symdel=1` - *Optional*, default value is `1`. + Indicates if the global macrovariables + `______1` to `______N` should be deleted + when the macro ends. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Embedding text in statements (the `%include` won't work here): +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + resetline; + filename f "%workpath()/testFile1.txt"; + filename f list; + + data _null_; + file f; + put "13 14 15"; + run; + + resetline; + data testDataset; + set sashelp.class; + where age in ( %mInclude(f) ); + run; + + data testDataset2; + set sashelp.class; + where age in ( %mInclude(f,source=1) ); + run; + + filename f clear; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Embedding with direct path (mind those quotes!): +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + resetline; + filename f "%workpath()/testFile2.txt"; + filename f list; + + %let someGlobalMacroVariable=17; + + data _null_; + file f; + put "options mprint;"; + do i=1 to 3; + put "data y; x = " i "; run;"; + put '%macro A' i +(-1) '(); %put ' i ' ** &someGlobalMacroVariable.; %mend; %A' i +(-1) '()'; + end; + put "options nomprint;"; + run; + + resetline; + %mInclude("%workpath()/testFile2.txt") + + %mInclude("%workpath()/testFile2.txt",source=1) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Embedding SQL code inside the pass through execution: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + resetline; + filename f2 "%workpath()/testSql.txt"; + + data _null_; + file f2; + input; + put _infile_; + cards4; + select + c2.make + , c2.model + , c2.type + , c2.invoice + , c2.date + + from + public.CARS_EU c2 + + where + c2.cylinders > 4 + and + c2.date > '2023-04-02' + ;;;; + run; + + + title 'the %include fails'; + proc sql; + connect to POSTGRES as PSGDB ( + server="127.0.0.1" + port=5432 + user="user" + password="password" + database="DB" + ); + + select * from connection to PSGDB + ( + %Include f2 / source2; + ) + ; + + disconnect from PSGDB; + quit; + + title 'the %mInclude works'; + proc sql; + connect to POSTGRES as PSGDB ( + server="127.0.0.1" + port=5432 + user="user" + password="password" + database="DB" + ); + + + select * from connection to PSGDB + ( + %mInclude(f2, source=1) + ) + ; + + disconnect from PSGDB; + quit; + + title; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** In a limited way and with help of the `resolve()` function, + it even works with IML's interface to R: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + +resetline; +filename f3 TEMP; + +data _null_; + file f3; + infile cards4; + input; + put _infile_ ';'; %* a "semicolon" trick for R statements separation *; +cards4; +rModel <- lm(Weight ~ Height, data=Class, na.action="na.exclude") +print (rModel$call) +print (rModel) +;;;; +run; + + +proc iml; + codeText = resolve(' %mInclude(f3, source=1) '); + print codeText; + + call ExportDataSetToR("Sashelp.Class", "Class" ); + submit codeText / R; + &codeText + endsubmit; +quit; + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%fmt()` macro: <<< ####################### + +The fmt() macro function returns a `value` formatted by a `format`, +it is a wrapper to `putN()` and `putC()` functions. + +See examples below for the details. + +The `%fmt()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%fmt( + value + ,format + ,align + <,type=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `value` - *Required*, a value to be formatted. + +2. `format` - *Required*, a name of a format to be used, + character format should be preceded by the `$`. + +3. `align` - *Optional*, allows to use the `-L`, `-R` and `-C` modifiers. + +* `type=n` - *Optional*, defines type of the format. If the format + name is preceded by the `$` then C is set automatically. + If the character format name is without `$` then set + value to `C` yourself. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Formatting values: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %fmt(111, 7.2); + + %put %fmt(111, dollar10.2); + + %put %fmt(abc, $upcase.); + + %put %fmt(12345, date9.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Align values (compare different results!): +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put *%fmt(ABC, $char9., -L)*; + %put *%fmt(ABC, $char9., -R)*; + %put *%fmt(ABC, $char9., -C)*; + + %put %fmt(ABC, $char9., -L); + %put %fmt(ABC, $char9., -R); + %put %fmt(ABC, $char9., -C); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%infmt()` macro: <<< ####################### + +The infmt() macro function returns a `value` read in by an `informat`, +it is a wrapper to `inputN()` and `inputC()` functions. + +See examples below for the details. + +The `%infmt()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%infmt( + value + ,informat + <,type=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `value` - *Required*, a value to be formatted. + +2. `informat` - *Required*, a name of a format to be used, + character format should be preceded by the `$`. + +* `type=n` - *Optional*, defines type of the informat. If the informat + name is preceded by the `$` then C is set automatically. + If the character format name is without `$` then set + value to `C` yourself. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Informatting values: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %infmt(111, 7.2); + %put %infmt(111.234, 7.2); + + %put %infmt($111, dollar10.2); + %put %infmt($111.234, dollar10.2); + + %put %infmt(abc, $upcase.); + + %put %infmt(12mar45, date9.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +--- + +--- + +--- + +## License #################################################################### + +Copyright (c) since 2020 Bartosz Jablonski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- diff --git a/hist/1.33.0/baseplus.zip b/hist/1.33.0/baseplus.zip new file mode 100644 index 0000000000000000000000000000000000000000..3c69e88c488104dbabfb317b203e746452a6802f GIT binary patch literal 291735 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℘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