15 Commits

Author SHA1 Message Date
SASPAC - SAS Packages Archive
2cad099652 Merge pull request #25 from SASPAC/dev
The BasePlus package [ver. 1.32.0]
2023-10-26 13:51:16 +02:00
Bart Jablonski
bfd3a9d0d9 The BasePlus package [ver. 1.32.0]
The BasePlus package [ver. 1.32.0]

New `%monthShift()` macro added:

```sas
%put %monthShift(2023,1,-3);
```

Doc. updated.
2023-10-26 13:49:12 +02:00
SASPAC - SAS Packages Archive
ab7feaa15a Merge pull request #24 from SASPAC/dev
The BasePlus package [ver. 1.32.0]
2023-10-26 13:28:50 +02:00
Bart Jablonski
01b1300a55 The BasePlus package [ver. 1.32.0]
The BasePlus package [ver. 1.32.0]

New `%monthShift()` macro added:

```sas
%put %monthShift(2023,1,-3);
```

Doc. updated.
2023-10-26 13:27:22 +02:00
SASPAC - SAS Packages Archive
ce6f6b56ee Merge pull request #23 from SASPAC/dev
The BasePlus package [ver. 1.31.0]
2023-10-12 17:26:03 +02:00
Bart Jablonski
2e1d9df0c3 The BasePlus package [ver. 1.31.0]
The BasePlus package [ver. 1.31.0]

A bunch of "date & time" macro one-liners added:

```sas
%put %today() %date() %time() %datetime();
```

Doc. updated.
2023-10-12 17:20:51 +02:00
SASPAC - SAS Packages Archive
696bceb913 Merge pull request #22 from SASPAC/dev
The BasePlus package [ver. 1.30.0]
2023-09-19 17:53:50 +02:00
Bart Jablonski
0c1e5c7d3a The BasePlus package [ver. 1.30.0]
The BasePlus package [ver. 1.30.0]

- new macro `%repList()` added
- doc. updated

SHA256 digest: `F*B91771D45C781B6806DBB44A3B491A0784D7698B9F3BBBE1A86EE5594834315F`
2023-09-19 17:44:00 +02:00
SASPAC - SAS Packages Archive
8b4b5e721d Merge pull request #21 from SASPAC/dev
The BasePlus package [ver. 1.29.1]
2023-09-04 16:47:35 +02:00
Bart Jablonski
b37f716731 The BasePlus package [ver. 1.29.0]
The BasePlus package [ver. 1.29.0]

Package regenerated with the latest version of the SAS Packages Framework (20230904).

SHA256 digest for the latest version of `BasePlus`: F*2FE68DD9B3692B9D46EF85B82F63C7E65010BF9E89D670FD1779F4670FA03F31
2023-09-04 16:35:24 +02:00
SASPAC - SAS Packages Archive
e81063f308 Merge pull request #20 from SASPAC/dev
The BasePlus package [ver. 1.29.0]
2023-08-24 11:43:24 +02:00
Bart Jablonski
86c8c164d1 The BasePlus package [ver. 1.29.0]
The BasePlus package [ver. 1.29.0]

Three new macros:
- fmt
- infmt
- minclude

Documentation updated.

SHA256 for BasePlus: `F*9EEE4F4B99EA725B60141645AB6A50BFEBA32CE54848593F8D832D907D63CAD7`
2023-08-24 11:32:14 +02:00
SASPAC - SAS Packages Archive
ba6870777f Merge pull request #19 from SASPAC/dev
The BasePlus package [ver. 1.26.1]
2023-06-02 11:46:25 +02:00
Bart Jablonski
779aa6d8e2 The BasePlus package [ver. 1.26.1]
The BasePlus package [ver. 1.26.1]

Updates:
- the `%RainCloudPlot()` has new parameter: `catAxisValueAttrs`,
- documentation was updated (refreshed example with plot).

The SHA256 hash digest for package BasePlus:
`F*D6DC5AD1B60A92AD300B639B3C361C1F7846EB01E5AB35BF4FDDA6E783408172`
2023-06-02 11:42:29 +02:00
Bart Jablonski
23b9d1530d Merge pull request #18 from SASPAC/main
The BasePlus package [ver. 1.26.0]
2023-06-01 17:41:45 +02:00
16 changed files with 34359 additions and 72 deletions

View File

@@ -45,10 +45,14 @@ libname NEW "%workPath()/new";
%put %translate(%str("A", "B", "C"),%str(%",),%str(%' )); %put %translate(%str("A", "B", "C"),%str(%",),%str(%' ));
%put %tranwrd(Miss Joan Smith,Miss,Ms.); %put %tranwrd(Miss Joan Smith,Miss,Ms.);
%put %date() %time() %datetime();
%put %monthShift(2023,1,-5);
``` ```
and more. and more.
SHA256 digest for the latest version of `BasePlus`: F*B3CACDA32A5E70940E667DCA859483BD76DB082D19BAF326F28A580226DDD962 SHA256 digest for the latest version of `BasePlus`: F*3407AD8068C7528E129034144F9A44CFDF14B7DC34334C64C2F1D67351D1E01E
[**Documentation for BasePlus**](./baseplus.md "Documentation for BasePlus") [**Documentation for BasePlus**](./baseplus.md "Documentation for BasePlus")

View File

@@ -52,6 +52,7 @@
* [`%bpPIPE()` macro](#bppipe-macro) * [`%bpPIPE()` macro](#bppipe-macro)
* [`%dirsAndFiles()` macro](#dirsandfiles-macro) * [`%dirsAndFiles()` macro](#dirsandfiles-macro)
* [`%repeatTxt()` macro](#repeattxt-macro) * [`%repeatTxt()` macro](#repeattxt-macro)
* [`%repList()` macro](#replist-macro)
* [`%intsList()` macro](#intslist-macro) * [`%intsList()` macro](#intslist-macro)
* [`%letters()` macro](#letters-macro) * [`%letters()` macro](#letters-macro)
* [`%splitDSIntoBlocks()` macro](#splitdsintoblocks-macro) * [`%splitDSIntoBlocks()` macro](#splitdsintoblocks-macro)
@@ -59,18 +60,25 @@
* [`%filePath()` macro](#filepath-macro) * [`%filePath()` macro](#filepath-macro)
* [`%libPath()` macro](#libpath-macro) * [`%libPath()` macro](#libpath-macro)
* [`%workPath()` macro](#workpath-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) * [`%translate()` macro](#translate-macro)
* [`%tranwrd()` macro](#tranwrd-macro) * [`%tranwrd()` macro](#tranwrd-macro)
* [`%findDSwithVarVal()` macro](#finddswithvarval-macro) * [`%findDSwithVarVal()` macro](#finddswithvarval-macro)
* [`%getTitle()` macro](#gettitle-macro) * [`%getTitle()` macro](#gettitle-macro)
* [`%mInclude()` macro](#minclude-macro)
* [`%fmt()` macro](#fmt-macro)
* [`%infmt()` macro](#infmt-macro)
* [License](#license) * [License](#license)
--- ---
# The BasePlus package [ver. 1.26.0] <a name="baseplus-package"></a> ############################################### # The BasePlus package [ver. 1.32.0] <a name="baseplus-package"></a> ###############################################
The **BasePlus** package implements useful The **BasePlus** package implements useful
functions and functionalities I miss in the BASE SAS. functions and functionalities I miss in the BASE SAS.
@@ -78,6 +86,7 @@ functions and functionalities I miss in the BASE SAS.
It is inspired by various people, e.g. It is inspired by various people, e.g.
- at the SAS-L discussion list - at the SAS-L discussion list
- at the communities.sas.com (SASware Ballot Ideas) - at the communities.sas.com (SASware Ballot Ideas)
- at StackOverflow
- at the Office... - at the Office...
- etc. - etc.
@@ -90,9 +99,8 @@ Kudos to all who inspired me to generate this package:
*Anamaria Calai*, *Anamaria Calai*,
*Michal Ludwicki*, *Michal Ludwicki*,
*Quentin McMullen*, *Quentin McMullen*,
*Kurt Bremser*. *Kurt Bremser*,
*Leonid Batkhan*.
Recording from the SAS Explore 2022 conference: [A BasePlus Package for SAS](https://communities.sas.com/t5/SAS-Explore-Presentations/A-BasePlus-Package-for-SAS/ta-p/838246 "A BasePlus Package for SAS") (September 27th-29th, 2022).
--- ---
@@ -281,6 +289,71 @@ run;
%put %GetTitle(1 2 3 5, dlm=s, qt='') ; %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: Package contains:
@@ -313,50 +386,60 @@ Package contains:
27. format ceil 27. format ceil
28. format floor 28. format floor
29. format int 29. format int
30. functions arrfill 30. function arrfill
31. functions arrfillc 31. function arrfillc
32. functions arrmissfill 32. function arrmissfill
33. functions arrmissfillc 33. function arrmissfillc
34. functions arrmisstoleft 34. function arrmisstoleft
35. functions arrmisstoleftc 35. function arrmisstoleftc
36. functions arrmisstoright 36. function arrmisstoright
37. functions arrmisstorightc 37. function arrmisstorightc
38. functions bracketsc 38. function bracketsc
39. functions bracketsn 39. function bracketsn
40. functions catxfc 40. function catxfc
41. functions catxfi 41. function catxfi
42. functions catxfj 42. function catxfj
43. functions catxfn 43. function catxfn
44. functions deldataset 44. function deldataset
45. functions semicolonc 45. function semicolonc
46. functions semicolonn 46. function semicolonn
47. format brackets 47. format brackets
48. format semicolon 48. format semicolon
49. proto qsortincbyprocproto 49. proto qsortincbyprocproto
50. functions frommissingtonumberbs 50. function frommissingtonumberbs
51. functions fromnumbertomissing 51. function fromnumbertomissing
52. functions quicksort4notmiss 52. function quicksort4notmiss
53. functions quicksorthash 53. function quicksorthash
54. functions quicksorthashsddv 54. function quicksorthashsddv
55. functions quicksortlight 55. function quicksortlight
56. macro filepath 56. macro date
57. macro finddswithvarval 57. macro datetime
58. macro gettitle 58. macro filepath
59. macro letters 59. macro finddswithvarval
60. macro libpath 60. macro fmt
61. macro translate 61. macro gettitle
62. macro tranwrd 62. macro infmt
63. macro workpath 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
Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load it Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load it
or look for the baseplus_AdditionalContent directory in the Packages fileref or look for the baseplus_AdditionalContent directory in the Packages fileref
localization (only if additional content was deployed during the installation process). localization (only if additional content was deployed during the installation process).
* SAS package generated by generatePackage, version 20230520 * * SAS package generated by generatePackage, version 20231024 *
The SHA256 hash digest for package BasePlus: The SHA256 hash digest for package BasePlus:
`F*B3CACDA32A5E70940E667DCA859483BD76DB082D19BAF326F28A580226DDD962` `F*3407AD8068C7528E129034144F9A44CFDF14B7DC34334C64C2F1D67351D1E01E`
--- ---
# Content description ############################################################################################ # Content description ############################################################################################
@@ -3135,6 +3218,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
<,y2axis=> <,y2axis=>
<,y2axisLevels=> <,y2axisLevels=>
<,y2axisValueAttrs=> <,y2axisValueAttrs=>
<,catAxisValueAttrs=>
<,xaxisValueAttrs=> <,xaxisValueAttrs=>
<,xaxisTickstyle=> <,xaxisTickstyle=>
<,sganno=> <,sganno=>
@@ -3245,6 +3329,9 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `y2axisValueAttrs` - *Optional*, default value `Color=Grey`. * `y2axisValueAttrs` - *Optional*, default value `Color=Grey`.
Allows to modify Y2 axis values attributes. 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`. * `xaxisValueAttrs` - *Optional*, default value `Color=Grey`.
Allows to modify X axis values attributes. Allows to modify X axis values attributes.
@@ -3447,6 +3534,7 @@ The output:
, sgPlotOptions=noborder , sgPlotOptions=noborder
, WidthPX=1000 , WidthPX=1000
, HeightPX=320 , HeightPX=320
, catAxisValueAttrs=Color=Green weight=bold
) )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -4362,6 +4450,118 @@ run;
--- ---
## >>> `%repList()` macro: <<< <a name="replist-macro"></a> #######################
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: <<< <a name="intslist-macro"></a> ####################### ## >>> `%intsList()` macro: <<< <a name="intslist-macro"></a> #######################
The intsList() macro function allows to print a list of The intsList() macro function allows to print a list of
@@ -4791,6 +4991,277 @@ The basic syntax is the following, the `<...>` means optional parameters:
--- ---
## >>> `%date()` macro: <<< <a name="date-macro"></a> #######################
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: <<< <a name="today-macro"></a> #######################
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: <<< <a name="time-macro"></a> #######################
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: <<< <a name="datetime-macro"></a> #######################
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: <<< <a name="monthshift-macro"></a> #######################
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: <<< <a name="translate-macro"></a> ####################### ## >>> `%translate()` macro: <<< <a name="translate-macro"></a> #######################
The translate() macro function allows to replace bytes with bytes in text string. The translate() macro function allows to replace bytes with bytes in text string.
@@ -5110,6 +5581,324 @@ The basic syntax is the following, the `<...>` means optional parameters:
--- ---
## >>> `%mInclude()` macro: <<< <a name="minclude-macro"></a> #######################
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 `______<N>` (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: <<< <a name="fmt-macro"></a> #######################
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: <<< <a name="infmt-macro"></a> #######################
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.);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--- ---

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 66 KiB

5148
hist/1.26.1/baseplus.md Normal file

File diff suppressed because it is too large Load Diff

BIN
hist/1.26.1/baseplus.zip Normal file

Binary file not shown.

5498
hist/1.29.0/baseplus.md Normal file

File diff suppressed because it is too large Load Diff

BIN
hist/1.29.0/baseplus.zip Normal file

Binary file not shown.

5498
hist/1.29.1/baseplus.md Normal file

File diff suppressed because it is too large Load Diff

BIN
hist/1.29.1/baseplus.zip Normal file

Binary file not shown.

5640
hist/1.30.0/baseplus.md Normal file

File diff suppressed because it is too large Load Diff

BIN
hist/1.30.0/baseplus.zip Normal file

Binary file not shown.

5778
hist/1.31.0/baseplus.md Normal file

File diff suppressed because it is too large Load Diff

BIN
hist/1.31.0/baseplus.zip Normal file

Binary file not shown.

5932
hist/1.32.0/baseplus.md Normal file

File diff suppressed because it is too large Load Diff

BIN
hist/1.32.0/baseplus.zip Normal file

Binary file not shown.