mirror of
https://github.com/SASPAC/macroarray.git
synced 2025-12-12 19:04:34 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3452ff5ac5 | ||
|
|
8c6b5e4b25 | ||
|
|
58e665069f | ||
|
|
b785e1c9e4 | ||
|
|
4b3d058e75 |
@@ -22,7 +22,7 @@ The **macroArray** package implements an array, a hash table, and a dictionary c
|
|||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
SHA256 digest for the latest version of `macroArray`: F*6A22A01868F4203862B3685F543D723C7DB8E9AB3C1A6357D2BFA030971B0D3C
|
SHA256 digest for the latest version of `macroArray`: F*FFF2C3D854F9B5677F561BA2EB6FAA2CCC652D81F6AF9473ADF0A4CE977E43F0
|
||||||
|
|
||||||
[**Documentation for macroArray**](./macroarray.md "Documentation for macroArray")
|
[**Documentation for macroArray**](./macroarray.md "Documentation for macroArray")
|
||||||
|
|
||||||
|
|||||||
2204
hist/1.1.1/macroarray.md
Normal file
2204
hist/1.1.1/macroarray.md
Normal file
File diff suppressed because it is too large
Load Diff
BIN
hist/1.1.1/macroarray.zip
Normal file
BIN
hist/1.1.1/macroarray.zip
Normal file
Binary file not shown.
2285
hist/1.2.0/macroarray.md
Normal file
2285
hist/1.2.0/macroarray.md
Normal file
File diff suppressed because it is too large
Load Diff
BIN
hist/1.2.0/macroarray.zip
Normal file
BIN
hist/1.2.0/macroarray.zip
Normal file
Binary file not shown.
2285
hist/1.2.1/macroarray.md
Normal file
2285
hist/1.2.1/macroarray.md
Normal file
File diff suppressed because it is too large
Load Diff
BIN
hist/1.2.1/macroarray.zip
Normal file
BIN
hist/1.2.1/macroarray.zip
Normal file
Binary file not shown.
2286
hist/1.2.3/macroarray.md
Normal file
2286
hist/1.2.3/macroarray.md
Normal file
File diff suppressed because it is too large
Load Diff
BIN
hist/1.2.3/macroarray.zip
Normal file
BIN
hist/1.2.3/macroarray.zip
Normal file
Binary file not shown.
2286
hist/1.2.5/macroarray.md
Normal file
2286
hist/1.2.5/macroarray.md
Normal file
File diff suppressed because it is too large
Load Diff
BIN
hist/1.2.5/macroarray.zip
Normal file
BIN
hist/1.2.5/macroarray.zip
Normal file
Binary file not shown.
112
macroarray.md
112
macroarray.md
@@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# The macroArray package [ver. 1.0.6] <a name="macroarray-package"></a> ###############################################
|
# The macroArray package [ver. 1.2.5] <a name="macroarray-package"></a> ###############################################
|
||||||
|
|
||||||
The **macroArray** package implements a macro array facility:
|
The **macroArray** package implements a macroarray facility:
|
||||||
- `%array()`,
|
- `%array()`,
|
||||||
- `%do_over()`,
|
- `%do_over()`,
|
||||||
- `%make_do_over()`,
|
- `%make_do_over()`,
|
||||||
@@ -75,10 +75,10 @@ Package contains:
|
|||||||
Required SAS Components:
|
Required SAS Components:
|
||||||
*Base SAS Software*
|
*Base SAS Software*
|
||||||
|
|
||||||
*SAS package generated by generatePackage, version 20230905*
|
*SAS package generated by generatePackage, version 20231123*
|
||||||
|
|
||||||
The SHA256 hash digest for package macroArray:
|
The SHA256 hash digest for package macroArray:
|
||||||
`F*4FAAEE7DF2854EA31933AE017A89C1615C7291A66A07CCE345041EB0D587ED4E`
|
`F*FFF2C3D854F9B5677F561BA2EB6FAA2CCC652D81F6AF9473ADF0A4CE977E43F0`
|
||||||
|
|
||||||
---
|
---
|
||||||
# Content description ############################################################################################
|
# Content description ############################################################################################
|
||||||
@@ -244,7 +244,7 @@ The code of a macro was inspired by
|
|||||||
|
|
||||||
The `%array()` macro version provided in the package
|
The `%array()` macro version provided in the package
|
||||||
is designed to facilitate
|
is designed to facilitate
|
||||||
the idea of macro array concept, i.e. *a list of
|
the idea of macroarray concept, i.e. *a list of
|
||||||
macrovariables with common prefix and numerical suffixes*.
|
macrovariables with common prefix and numerical suffixes*.
|
||||||
Usually such construction is then resolved by
|
Usually such construction is then resolved by
|
||||||
double ampersand syntax, e.g. `&&perfix&i` or similar one.
|
double ampersand syntax, e.g. `&&perfix&i` or similar one.
|
||||||
@@ -253,7 +253,7 @@ What is new/extension to the `%array()` macro concept are:
|
|||||||
|
|
||||||
0. The syntax is closer to the data step one.
|
0. The syntax is closer to the data step one.
|
||||||
1. It is a pure macro code (it can be executed in any place
|
1. It is a pure macro code (it can be executed in any place
|
||||||
of 4GL code), this includes generating macro arrays out
|
of 4GL code), this includes generating macroarrays out
|
||||||
of datasets.
|
of datasets.
|
||||||
2. When a macroarrray is created it allows also to generate
|
2. When a macroarrray is created it allows also to generate
|
||||||
a new macro (named the same as the array name) and replace
|
a new macro (named the same as the array name) and replace
|
||||||
@@ -346,8 +346,9 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
|||||||
3) macroarray "W" with UNIQUE(|) values of variable "weight" and <br>
|
3) macroarray "W" with UNIQUE(|) values of variable "weight" and <br>
|
||||||
4) macroarray "AGE" with UNIQUE(|) values of variable "age".
|
4) macroarray "AGE" with UNIQUE(|) values of variable "age".
|
||||||
|
|
||||||
* `q=` - *Optional*, indicates (when set to `1`) if the value be surrounded by quotes.
|
* `q=` - *Optional*, indicates (when set to `1` or '2') if the value should be surrounded by quotes.
|
||||||
It uses `quote(cats(...))` combo under the hood. Default value is `0`.
|
It uses `quote(cats(...))` combo under the hood. Default value is `0`.
|
||||||
|
Value `1` is for apostrophes, value `2` is for double quotes.
|
||||||
Ignored for `macarray=M`.
|
Ignored for `macarray=M`.
|
||||||
|
|
||||||
|
|
||||||
@@ -1556,6 +1557,9 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
|||||||
%mcDictionary(
|
%mcDictionary(
|
||||||
H
|
H
|
||||||
<,METHOD>
|
<,METHOD>
|
||||||
|
<,DS=>
|
||||||
|
<,K=Key>
|
||||||
|
<,D=Data>
|
||||||
)
|
)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -1571,6 +1575,18 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
|||||||
If `DELETE` then the macro dictionary named by `H` and all
|
If `DELETE` then the macro dictionary named by `H` and all
|
||||||
macrovariables named like "`&H._`" are deleted.
|
macrovariables named like "`&H._`" are deleted.
|
||||||
|
|
||||||
|
* `DS=` - *Optional*, if NOT empty then the `&DS.` dataset is used to
|
||||||
|
populate dictionary with keys from variable `&K.` and data
|
||||||
|
from variable `&D.` Works only during declaration.
|
||||||
|
|
||||||
|
* `K=` - *Optional*, if the `&DS.` is NOT empty then `&K.` holds a name of
|
||||||
|
a variable which keeps or an expression which generates keys values.
|
||||||
|
Default is `Key`.
|
||||||
|
|
||||||
|
* `D=` - *Optional*, if the `&DS.` is NOT empty then `&D.` holds a name of
|
||||||
|
a variable which keeps or an expression which generates data values.
|
||||||
|
Default is `Data`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### THE CREATED MACRO `%&H.()`: ####################################################
|
### THE CREATED MACRO `%&H.()`: ####################################################
|
||||||
@@ -1704,7 +1720,7 @@ See examples below to see use cases.
|
|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
||||||
**EXAMPLE 2.** Populate macro dictionary from a dataset.
|
**EXAMPLE 2A.** Populate macro dictionary from a dataset "by hand".
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||||
%mcDictionary(CLASS)
|
%mcDictionary(CLASS)
|
||||||
@@ -1714,6 +1730,7 @@ data _null_;
|
|||||||
call execute('%CLASS(ADD,key=' !! name !! ',data=' !! age !! ')');
|
call execute('%CLASS(ADD,key=' !! name !! ',data=' !! age !! ')');
|
||||||
run;
|
run;
|
||||||
%put t = %sysevalf(%sysfunc(datetime()) - &t.);
|
%put t = %sysevalf(%sysfunc(datetime()) - &t.);
|
||||||
|
%put &=Class_KEYSNUM.;
|
||||||
%put _user_;
|
%put _user_;
|
||||||
%CLASS(CLEAR)
|
%CLASS(CLEAR)
|
||||||
|
|
||||||
@@ -1721,25 +1738,52 @@ run;
|
|||||||
%mcDictionary(CARS)
|
%mcDictionary(CARS)
|
||||||
%let t = %sysfunc(datetime());
|
%let t = %sysfunc(datetime());
|
||||||
data _null_;
|
data _null_;
|
||||||
set sashelp.cars;
|
set sashelp.cars(obs=42);
|
||||||
call execute('%CARS(ADD,key=' !! catx("|",make,model,type) !! ',data=' !! MPG_CITY !! ')');
|
call execute('%CARS(ADD,key=' !! catx("|",make,model,type) !! ',data=' !! put(MPG_CITY*10,dollar10.2) !! ')');
|
||||||
run;
|
run;
|
||||||
%put t = %sysevalf(%sysfunc(datetime()) - &t.);
|
%put t = %sysevalf(%sysfunc(datetime()) - &t.);
|
||||||
%put &=CARS_KEYSNUM.;
|
%put &=CARS_KEYSNUM.;
|
||||||
%CARS(LIST);
|
%CARS(LIST);
|
||||||
|
|
||||||
|
%put %CARS(F,key=Audi|TT 3.2 coupe 2dr (convertible)|Sports);
|
||||||
|
|
||||||
%CARS(CLEAR)
|
%CARS(CLEAR)
|
||||||
%put &=CARS_KEYSNUM.;
|
%put &=CARS_KEYSNUM.;
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
||||||
**EXAMPLE 3.** Data portion may require quoting and un-quoting..
|
**EXAMPLE 2B.** Populate macro dictionary from a dataset "automatically".
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||||
|
%let t = %sysfunc(datetime());
|
||||||
|
%mcDictionary(CLASS,DCL,DS=sashelp.class,k=name,d=_N_)
|
||||||
|
%put t = %sysevalf(%sysfunc(datetime()) - &t.);
|
||||||
|
%put &=CLASS_KEYSNUM.;
|
||||||
|
%put _user_;
|
||||||
|
%CLASS(CLEAR)
|
||||||
|
|
||||||
|
|
||||||
|
%let t = %sysfunc(datetime());
|
||||||
|
%mcDictionary(CARS,DCL,DS=sashelp.cars(obs=42),k=catx("|",make,model,type),d=put(MPG_CITY*10,dollar10.2))
|
||||||
|
%put t = %sysevalf(%sysfunc(datetime()) - &t.);
|
||||||
|
%put &=CARS_KEYSNUM.;
|
||||||
|
%CARS(LIST);
|
||||||
|
|
||||||
|
%put %CARS(F,key=Audi|TT 3.2 coupe 2dr (convertible)|Sports);
|
||||||
|
|
||||||
|
%CARS(CLEAR)
|
||||||
|
%put &=CARS_KEYSNUM.;
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
||||||
|
**EXAMPLE 3.** Data portion may require quoting and un-quoting.
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||||
%mcDictionary(CODE)
|
%mcDictionary(CODE)
|
||||||
%CODE(CLEAR)
|
%CODE(CLEAR)
|
||||||
%CODE(ADD,key=data, data=%str(data test; x = 42; run;))
|
%CODE(ADD,key=data, data=%str(data test; x = 42; run;))
|
||||||
%CODE(ADD,key=proc, data=%str(proc print; run;))
|
%CODE(ADD,key=proc, data=%str(proc print; run;))
|
||||||
%CODE(ADD,key=macro,data=%nrstr(%put *****;))
|
%CODE(ADD,key=macro,data=%nrstr(%put *1*2*3*4*;))
|
||||||
|
|
||||||
%CODE(FIND,key=data)
|
%CODE(FIND,key=data)
|
||||||
%CODE(FIND,key=proc)
|
%CODE(FIND,key=proc)
|
||||||
@@ -1765,6 +1809,7 @@ data _null_;
|
|||||||
end;
|
end;
|
||||||
run;
|
run;
|
||||||
%put t = %sysevalf(%sysfunc(datetime()) - &t.);
|
%put t = %sysevalf(%sysfunc(datetime()) - &t.);
|
||||||
|
%put %AAA(F,key=A555) %AAA(CHECK,key=A555);
|
||||||
%put &=AAA_KEYSNUM;
|
%put &=AAA_KEYSNUM;
|
||||||
%AAA(CLEAR)
|
%AAA(CLEAR)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -1780,13 +1825,50 @@ run;
|
|||||||
%mcDictionary(ABCDEFGHIJKLMNOP) %* good;
|
%mcDictionary(ABCDEFGHIJKLMNOP) %* good;
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
||||||
|
**EXAMPLE 6.** More fun with datasets.
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||||
|
|
||||||
|
data work.metadata;
|
||||||
|
input key :$16. data :$128.;
|
||||||
|
cards;
|
||||||
|
ID ABC-123-XYZ
|
||||||
|
path /path/to/study/data
|
||||||
|
cutoffDT 2023-01-01
|
||||||
|
startDT 2020-01-01
|
||||||
|
endDT 2024-12-31
|
||||||
|
MedDRA v26.0
|
||||||
|
;
|
||||||
|
run;
|
||||||
|
proc print;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mcDictionary(Study,dcl,DS=work.metadata)
|
||||||
|
|
||||||
|
%put _user_;
|
||||||
|
|
||||||
|
%put *%Study(F,key=ID)**%Study(C,key=ID)*;
|
||||||
|
|
||||||
|
title1 "Study %Study(F,key=ID) is located at %Study(F,key=path)";
|
||||||
|
title2 "it starts %Study(F,key=startDT) and ends %Study(F,key=endDT)";
|
||||||
|
footnote "MedDRA version: %Study(F,key=MedDRA)";
|
||||||
|
|
||||||
|
proc print data=sashelp.class(obs=7);
|
||||||
|
run;
|
||||||
|
|
||||||
|
title;
|
||||||
|
footnote;
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## >>> `%QzipArrays()` macro: <<< <a name="qziparrays-macro"></a> #######################
|
## >>> `%QzipArrays()` macro: <<< <a name="qziparrays-macro"></a> #######################
|
||||||
|
|
||||||
The zipArrays() and QzipArrays() macros
|
The zipArrays() and QzipArrays() macros
|
||||||
allow to use a function on elements of pair of
|
allow to use a function on elements of pair of
|
||||||
macro arrays.
|
macroarrays.
|
||||||
|
|
||||||
For two macroarrays the corresponding
|
For two macroarrays the corresponding
|
||||||
elements are taken and the macro applies a function, provided by user,
|
elements are taken and the macro applies a function, provided by user,
|
||||||
@@ -1897,7 +1979,7 @@ See examples in `%zipArrays()` help for the details.
|
|||||||
|
|
||||||
The zipArrays() and QzipArrays() macros
|
The zipArrays() and QzipArrays() macros
|
||||||
allow to use a function on elements of pair of
|
allow to use a function on elements of pair of
|
||||||
macro arrays.
|
macroarrays.
|
||||||
|
|
||||||
For two macroarrays the corresponding
|
For two macroarrays the corresponding
|
||||||
elements are taken and the macro applies a function, provided by user,
|
elements are taken and the macro applies a function, provided by user,
|
||||||
@@ -2096,7 +2178,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
|||||||
## >>> `%sortMacroArray()` macro: <<< <a name="sortmacroarray-macro"></a> #######################
|
## >>> `%sortMacroArray()` macro: <<< <a name="sortmacroarray-macro"></a> #######################
|
||||||
|
|
||||||
The sortMacroArray() macro
|
The sortMacroArray() macro
|
||||||
allow to sort elements of a macro array.
|
allow to sort elements of a macroarray.
|
||||||
|
|
||||||
The **limitation** is that sorted values are limited to 32767 bytes of length.
|
The **limitation** is that sorted values are limited to 32767 bytes of length.
|
||||||
|
|
||||||
|
|||||||
BIN
macroarray.zip
BIN
macroarray.zip
Binary file not shown.
Reference in New Issue
Block a user