From 0cf35c15a77b34dbf6f52776188649e2a7fe5c24 Mon Sep 17 00:00:00 2001 From: "Bart Jablonski (yabwon)" Date: Tue, 28 Dec 2021 18:29:24 +0100 Subject: [PATCH] Package MacroArray, version 0.9 Package MacroArray, version 0.9: -New macro `%sortMacroArra()` added. -The doc. updated. --- README.md | 4 +- packages/README.md | 4 +- packages/SHA256_for_packages.txt | 3 + packages/macroarray.md | 98 ++++++++++++++++++++++++++++++- packages/macroarray.zip | Bin 43947 -> 45679 bytes 5 files changed, 102 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1a836c3..3ef178a 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ SHA256 digest for DFA: C32A81304A411C1EB6BA7B76EDB8D70550F3935F35A1506E2B8019A20 [Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA") -- **macroArray**\[0.8\], implementation of an array concept in a macrolanguage, e.g. +- **macroArray**\[0.9\], implementation of an array concept in a macrolanguage, e.g. ```sas %array(ABC[17] (111:127), macarray=Y); @@ -141,7 +141,7 @@ SHA256 digest for DFA: C32A81304A411C1EB6BA7B76EDB8D70550F3935F35A1506E2B8019A20 which = 1:H:2 ); ``` -SHA256 digest for macroArray: 9FE227EF3144431B51063D599148BDD8873509D1B32F1AC2979EC566E1BB1487 +SHA256 digest for macroArray: 95164E71AF0B86AC816F13821F6468F611C6E5BB9036AC10459CDEB10487B08E [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") diff --git a/packages/README.md b/packages/README.md index 31b8aa2..923afb3 100644 --- a/packages/README.md +++ b/packages/README.md @@ -65,7 +65,7 @@ SHA256 digest for DFA: C32A81304A411C1EB6BA7B76EDB8D70550F3935F35A1506E2B8019A20 --- -- **macroArray**\[0.8\], implementation of an array concept in a macro language, e.g. +- **macroArray**\[0.9\], implementation of an array concept in a macro language, e.g. ```sas %array(ABC[17] (111:127), macarray=Y); @@ -84,7 +84,7 @@ SHA256 digest for DFA: C32A81304A411C1EB6BA7B76EDB8D70550F3935F35A1506E2B8019A20 which = 1:H:2 ); ``` -SHA256 digest for macroArray: 70032D27081A0EE15BC82B8F14D2A61700FA7C1F0D88B4DB516AB433CD06C4D3 +SHA256 digest for macroArray: 95164E71AF0B86AC816F13821F6468F611C6E5BB9036AC10459CDEB10487B08E [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 4085966..242ebbe 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20211228 */ +macroArray: 95164E71AF0B86AC816F13821F6468F611C6E5BB9036AC10459CDEB10487B08E + /* 20211123 */ BasePlus: 105F0CEB95C49102BDB085DF67C785301F623CB337D466F07B5E051626E4AE61 diff --git a/packages/macroarray.md b/packages/macroarray.md index bcb15c4..f35e5da 100644 --- a/packages/macroarray.md +++ b/packages/macroarray.md @@ -12,11 +12,13 @@ * [`%mcHashTable()` macro](#mchashtable-macro) * [`%QzipArrays()` macro](#qziparrays-macro) * [`%zipArrays()` macro](#ziparrays-macro) + * [`%sortMacroArray()` macro](#sortmacroarray-macro) + * [License](#license) --- -# The macroArray package [ver. 0.8] ############################################### +# The macroArray package [ver. 0.9] ############################################### The **macroArray** package implements a macro array facility: - `%array()`, @@ -27,6 +29,7 @@ The **macroArray** package implements a macro array facility: - `%appendcell()`, - `%mcHashTable()`, - `%zipArrays()`, +- `%sortMacroArray()`, - etc. The set of macros, which emulates classic @@ -62,14 +65,17 @@ Package contains: 8. macro do_over3 9. macro make_do_over 10. macro mchashtable + 11. macro sortmacroarray + 12. macro qziparrays + 13. macro ziparrays Required SAS Components: *Base SAS Software* -*SAS package generated by generatePackage, version 20211111.* +*SAS package generated by generatePackage, version 20211216.* The SHA256 hash digest for package macroArray: -`70032D27081A0EE15BC82B8F14D2A61700FA7C1F0D88B4DB516AB433CD06C4D3` +`95164E71AF0B86AC816F13821F6468F611C6E5BB9036AC10459CDEB10487B08E` --- # Content description ############################################################################################ @@ -1833,6 +1839,92 @@ The basic syntax is the following, the `<...>` means optional parameters: --- +## >>> `%sortMacroArray()` macro: <<< ####################### + +The sortMacroArray() macro +allow to sort elements of a macro array. + +The **limitation** is that sorted values are limited to 32767 bytes of length. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%sortMacroArray( + array + <,valLength=> + <,outSet=> + <,sortseq=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `array` - *Required*, name of an array generated by the `%array()` macro. + +* `valLength = 32767` - *Optional*, default value is `32767`, + maximum length of a variable storing macrovariable data. + (the reason of 32767 limitation) + +* `outSet = _NULL_` - *Optional*, default value is `_NULL_`, + an optional output dataset name. + +* `sortseq =` - *Optional*, default value is `LINGUISTIC(NUMERIC_COLLATION = ON)`, + sorting options for use in an internal `Proc SORT`. + +### EXAMPLES AND USECASES: #################################################### + + +**EXAMPLE 1.** Basic use-case. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + +options mprint; +ods html; +ods listing close; + + +%array(hij [4:9] $ 512 ("C33" "B22" "A11" "A01" "A02" "X42"), macarray=Y) + +%put NOTE: %do_over(hij); + +%sortMacroArray(hij, valLength=3, outSet = A_NULL_(compress=char)) + +%put NOTE: %do_over(hij); + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Basic use-case. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + +options mprint; +ods html; +ods listing close; + + +%array(ds = sashelp.class, vars = name|NNN height|h, macarray=Y) +%array(ds = sashelp.cars, vars = model|, macarray=Y) + +%put NOTE: %do_over(NNN); +%put NOTE: %do_over(H); +%put NOTE: %do_over(model); + +%sortMacroArray(NNN, valLength=30, outSet = A_NULL_(compress=char)) +%sortMacroArray(H, valLength=32) +%sortMacroArray(model, valLength=120) + +%put NOTE: %do_over(NNN); +%put NOTE: %do_over(H); +%put NOTE: %do_over(model); + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + ## License #################################################################### Copyright (c) Bartosz Jablonski, since January 2019 diff --git a/packages/macroarray.zip b/packages/macroarray.zip index 16023e043c05fd0f942d7d984ffc8f0ee2234843..71f81d0281f5152c38b583d51b8e44a5fec50be9 100644 GIT binary patch delta 10452 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 G;r{>+N>soA delta 8804 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