mirror of
https://github.com/sasjs/core.git
synced 2026-01-09 10:20:06 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51db64c90a | ||
|
|
7c4278c3f9 | ||
|
|
6c6b55dcea | ||
|
|
66b0c9e77e | ||
|
|
caf3b95269 | ||
|
|
3866b97416 | ||
|
|
d687658687 | ||
|
|
9f815c73e9 | ||
|
|
a13c782074 | ||
|
|
f2991cfd63 |
288
all.sas
288
all.sas
@@ -249,8 +249,12 @@ https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md#functionex
|
|||||||
|
|
||||||
%put %mf_existvar(work.someds, somevar)
|
%put %mf_existvar(work.someds, somevar)
|
||||||
|
|
||||||
@param libds (positional) - 2 part dataset or view reference
|
@param [in] libds 2 part dataset or view reference
|
||||||
@param var (positional) - variable name
|
@param [in] var variable name
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mf_existvar.test.sas
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
**/
|
**/
|
||||||
@@ -484,9 +488,10 @@ https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md#functionex
|
|||||||
contributors of Chris Hemedingers blog [post](
|
contributors of Chris Hemedingers blog [post](
|
||||||
http://blogs.sas.com/content/sasdummy/2013/06/04/find-a-sas-library-engine/)
|
http://blogs.sas.com/content/sasdummy/2013/06/04/find-a-sas-library-engine/)
|
||||||
|
|
||||||
@param libref Library reference (also accepts a 2 level libds ref).
|
@param [in] libref Library reference (also accepts a 2 level libds ref).
|
||||||
|
|
||||||
@return output returns the library engine for the FIRST library encountered.
|
@return output returns the library engine (uppercase) for the FIRST library
|
||||||
|
encountered.
|
||||||
|
|
||||||
@warning will only return the FIRST library engine - for concatenated
|
@warning will only return the FIRST library engine - for concatenated
|
||||||
libraries, with different engines, inconsistent results may be encountered.
|
libraries, with different engines, inconsistent results may be encountered.
|
||||||
@@ -518,7 +523,7 @@ https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md#functionex
|
|||||||
%let rc= %sysfunc(close(&dsid));
|
%let rc= %sysfunc(close(&dsid));
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
&engine
|
%upcase(&engine)
|
||||||
|
|
||||||
%mend mf_getengine;
|
%mend mf_getengine;
|
||||||
|
|
||||||
@@ -1953,6 +1958,72 @@ Usage:
|
|||||||
%mend mf_wordsInStr1ButNotStr2;
|
%mend mf_wordsInStr1ButNotStr2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@file
|
||||||
|
@brief Creates a text file using pure macro
|
||||||
|
@details Creates a text file of up to 10 lines. If further lines are
|
||||||
|
desired, feel free to [create an issue](
|
||||||
|
https://github.com/sasjs/core/issues/new), or make a pull request!
|
||||||
|
|
||||||
|
The use of PARMBUFF was considered for this macro, but it would have made
|
||||||
|
things problematic for writing lines containing commas.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content)
|
||||||
|
data _null_;
|
||||||
|
infile "&sasjswork/myfile.txt";
|
||||||
|
input;
|
||||||
|
list;
|
||||||
|
run;
|
||||||
|
|
||||||
|
@param [in] fpath Full path to file to be created or appended to
|
||||||
|
@param [in] mode= (O) Available options are A or O as follows:
|
||||||
|
@li A APPEND mode, writes new records after the current end of the file.
|
||||||
|
@li O OUTPUT mode, writes new records from the beginning of the file.
|
||||||
|
@param [in] l1= First line
|
||||||
|
@param [in] l2= Second line (etc through to l10)
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mf_writefile.test.sas
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
**/
|
||||||
|
/** @cond */
|
||||||
|
|
||||||
|
%macro mf_writefile(fpath,mode=O,l1=,l2=,l3=,l4=,l5=,l6=,l7=,l8=,l9=,l10=
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
%local fref rc fid i total_lines;
|
||||||
|
|
||||||
|
/* find number of lines by reference to first non-blank param */
|
||||||
|
%do i=10 %to 1 %by -1;
|
||||||
|
%if %str(&&l&i) ne %str() %then %goto continue;
|
||||||
|
%end;
|
||||||
|
%continue:
|
||||||
|
%let total_lines=&i;
|
||||||
|
|
||||||
|
%if %sysfunc(filename(fref,&fpath)) ne 0 %then %do;
|
||||||
|
%put &=fref &=fpath;
|
||||||
|
%put %str(ERR)OR: %sysfunc(sysmsg());
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%let fid=%sysfunc(fopen(&fref,&mode));
|
||||||
|
|
||||||
|
%if &fid=0 %then %do;
|
||||||
|
%put %str(ERR)OR: %sysfunc(sysmsg());
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%do i=1 %to &total_lines;
|
||||||
|
%let rc=%sysfunc(fput(&fid, &&l&i));
|
||||||
|
%let rc=%sysfunc(fwrite(&fid));
|
||||||
|
%end;
|
||||||
|
%let rc=%sysfunc(fclose(&fid));
|
||||||
|
%let rc=%sysfunc(filename(&fref));
|
||||||
|
|
||||||
|
%mend mf_writefile;
|
||||||
|
/** @endcond *//**
|
||||||
@file
|
@file
|
||||||
@brief abort gracefully according to context
|
@brief abort gracefully according to context
|
||||||
@details Configures an abort mechanism according to site specific policies or
|
@details Configures an abort mechanism according to site specific policies or
|
||||||
@@ -2264,6 +2335,186 @@ Usage:
|
|||||||
%end;
|
%end;
|
||||||
|
|
||||||
%mend mp_appendfile;/**
|
%mend mp_appendfile;/**
|
||||||
|
@file
|
||||||
|
@brief Apply a set of formats to a table
|
||||||
|
@details Applies a set of formats to one or more SAS datasets. Can be used
|
||||||
|
to migrate formats from one table to another. The input table must contain
|
||||||
|
the following columns:
|
||||||
|
|
||||||
|
@li lib - the libref of the table to be updated
|
||||||
|
@li ds - the dataset to be updated
|
||||||
|
@li var - the variable to be updated
|
||||||
|
@li fmt - the format to apply. Missing or default ($CHAR, 8.) formats are
|
||||||
|
ignored.
|
||||||
|
|
||||||
|
The macro will abort in the following scenarios:
|
||||||
|
|
||||||
|
@li Libref not assigned
|
||||||
|
@li Dataset does not exist
|
||||||
|
@li Input table contains null or invalid values
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
data work.example;
|
||||||
|
set sashelp.prdsale;
|
||||||
|
format _all_ clear;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_getcols(sashelp.prdsale,outds=work.cols)
|
||||||
|
|
||||||
|
data work.cols2;
|
||||||
|
set work.cols;
|
||||||
|
lib='WORK';
|
||||||
|
ds='EXAMPLE';
|
||||||
|
var=name;
|
||||||
|
fmt=format;
|
||||||
|
keep lib ds var fmt;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_applyformats(work.cols2)
|
||||||
|
|
||||||
|
@param [in] inds The input dataset containing the formats to apply (and where
|
||||||
|
to apply them). Example structure:
|
||||||
|
|LIB:$8.|DS:$32.|VAR:$32.|FMT:$49.|
|
||||||
|
|---|---|---|---|
|
||||||
|
|`WORK `|`EXAMPLE `|`ACTUAL `|`DOLLAR12.2 `|
|
||||||
|
|`WORK `|`EXAMPLE `|`COUNTRY `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`DIVISION `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`MONTH `|`MONNAME3. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`PREDICT `|`DOLLAR12.2 `|
|
||||||
|
|`WORK `|`EXAMPLE `|`PRODTYPE `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`PRODUCT `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`QUARTER `|`8. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`REGION `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`YEAR `|`8. `|
|
||||||
|
|
||||||
|
@param [out] errds= (0) Provide a libds reference here to export the
|
||||||
|
error messages to a table. In this case, they will not be printed to the
|
||||||
|
log.
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_getengine.sas
|
||||||
|
@li mf_getuniquefileref.sas
|
||||||
|
@li mf_getuniquename.sas
|
||||||
|
@li mf_nobs.sas
|
||||||
|
@li mp_validatecol.sas
|
||||||
|
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_getformats.sas
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mp_applyformats(inds,errds=0
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
%local outds liblist i engine lib msg ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validations
|
||||||
|
*/
|
||||||
|
proc sort data=&inds;
|
||||||
|
by lib ds var fmt;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%if &errds=0 %then %let outds=%mf_getuniquename(prefix=mp_applyformats);
|
||||||
|
%else %let outds=&errds;
|
||||||
|
|
||||||
|
data &outds;
|
||||||
|
set &inds;
|
||||||
|
where fmt not in ('','.', '$', '$CHAR.','8.');
|
||||||
|
length msg $128;
|
||||||
|
by lib ds var fmt;
|
||||||
|
if libref(lib) ne 0 then do;
|
||||||
|
msg=catx(' ','libref',lib,'is not assigned!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
if exist(cats(lib,'.',ds)) ne 1 then do;
|
||||||
|
msg=catx(' ','libds',lib,'.',ds,'does not exist!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
%mp_validatecol(fmt,FORMAT,is_fmt)
|
||||||
|
if is_fmt=0 then do;
|
||||||
|
msg=catx(' ','format',fmt,'on libds',lib,'.',ds,'.',var,'is not valid!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if first.ds then do;
|
||||||
|
retain dsid;
|
||||||
|
dsid=open(cats(lib,'.',ds));
|
||||||
|
if dsid=0 then do;
|
||||||
|
msg=catx(' ','libds',lib,'.',ds,' could not be opened!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
if varnum(dsid,var)<1 then do;
|
||||||
|
msg=catx(' ','Variable',lib,'.',ds,'.',var,' was not found!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if last.ds then rc=close(dsid);
|
||||||
|
run;
|
||||||
|
|
||||||
|
proc sql noprint;
|
||||||
|
select distinct lib into: liblist separated by ' ' from &inds;
|
||||||
|
%put &=liblist;
|
||||||
|
%do i=1 %to %sysfunc(countw(&liblist));
|
||||||
|
%let lib=%scan(&liblist,1);
|
||||||
|
%let engine=%mf_getengine(&lib);
|
||||||
|
%if &engine ne V9 and &engine ne BASE %then %do;
|
||||||
|
%let msg=&lib has &engine engine - formats cannot be applied;
|
||||||
|
proc sql;
|
||||||
|
insert into &outds set lib="&lib",ds="_all_",var="_all", msg="&msg" ;
|
||||||
|
%if &errds=0 %then %put %str(ERR)OR: &msg;
|
||||||
|
%end;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if %mf_nobs(&outds)>0 %then %return;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validations complete - now apply the actual formats!
|
||||||
|
*/
|
||||||
|
%let fref=%mf_getuniquefileref();
|
||||||
|
data _null_;
|
||||||
|
set &inds;
|
||||||
|
by lib ds var fmt;
|
||||||
|
where fmt not in ('','.', '$', '$CHAR.','8.');
|
||||||
|
file &fref;
|
||||||
|
if first.lib then put 'proc datasets nolist lib=' lib ';';
|
||||||
|
if first.ds then put ' modify ' ds ';';
|
||||||
|
put ' format ' var fmt ';';
|
||||||
|
if last.ds then put ' run;';
|
||||||
|
if last.lib then put 'quit;';
|
||||||
|
run;
|
||||||
|
|
||||||
|
%inc &fref/source2;
|
||||||
|
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
proc sql;
|
||||||
|
drop table &outds;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mp_applyformats;/**
|
||||||
@file
|
@file
|
||||||
@brief Generic assertion
|
@brief Generic assertion
|
||||||
@details Useful in the context of writing sasjs tests. The results of the
|
@details Useful in the context of writing sasjs tests. The results of the
|
||||||
@@ -5894,6 +6145,7 @@ https://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#
|
|||||||
|
|
||||||
|
|
||||||
<h4> Related Macros </h4>
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_applyformats.sas
|
||||||
@li mp_getformats.test.sas
|
@li mp_getformats.test.sas
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@@ -7702,11 +7954,15 @@ lock &libds clear;
|
|||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getuniquename.sas
|
@li mf_getuniquename.sas
|
||||||
@li mf_getvarlen.sas
|
@li mf_getvarlen.sas
|
||||||
|
@li mf_getvarlist.sas
|
||||||
@li mf_islibds.sas
|
@li mf_islibds.sas
|
||||||
@li mf_nobs.sas
|
@li mf_nobs.sas
|
||||||
@li mp_getcols.sas
|
@li mp_getcols.sas
|
||||||
@li mp_getpk.sas
|
@li mp_getpk.sas
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_makedata.test.sas
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
|
||||||
@@ -7738,7 +7994,7 @@ lock &libds clear;
|
|||||||
%mp_getpk(&lib,ds=&ds,outds=&ds1)
|
%mp_getpk(&lib,ds=&ds,outds=&ds1)
|
||||||
|
|
||||||
proc sql noprint;
|
proc sql noprint;
|
||||||
select pk_fields into: pk_fields from &ds1;
|
select coalescec(pk_fields,'_all_') into: pk_fields from &ds1;
|
||||||
|
|
||||||
data &ds2;
|
data &ds2;
|
||||||
if 0 then set &libds;
|
if 0 then set &libds;
|
||||||
@@ -7747,7 +8003,7 @@ data &ds2;
|
|||||||
%if &charvars ^= %then %do i=1 %to %sysfunc(countw(&charvars));
|
%if &charvars ^= %then %do i=1 %to %sysfunc(countw(&charvars));
|
||||||
%let col=%scan(&charvars,&i);
|
%let col=%scan(&charvars,&i);
|
||||||
/* create random value based on observation number and colum length */
|
/* create random value based on observation number and colum length */
|
||||||
&col=substr(put(md5(_n_),$hex32.),1,%mf_getvarlen(&libds,&col));
|
&col=repeat(put(md5(cats(_n_)),$hex32.),%mf_getvarlen(&libds,&col)/32);
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
%let numvars=%mf_getvarlist(&libds,typefilter=N);
|
%let numvars=%mf_getvarlist(&libds,typefilter=N);
|
||||||
@@ -7757,6 +8013,7 @@ data &ds2;
|
|||||||
%end;
|
%end;
|
||||||
output;
|
output;
|
||||||
end;
|
end;
|
||||||
|
stop;
|
||||||
run;
|
run;
|
||||||
proc sort data=&ds2 nodupkey;
|
proc sort data=&ds2 nodupkey;
|
||||||
by &pk_fields;
|
by &pk_fields;
|
||||||
@@ -9635,10 +9892,13 @@ alter table &libds modify &var char(&len);
|
|||||||
;;;;
|
;;;;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
Tip - when contributing, use https://regex101.com to test the regex validity!
|
||||||
|
|
||||||
@param [in] incol The column to be validated
|
@param [in] incol The column to be validated
|
||||||
@param [in] rule The rule to apply. Current rules:
|
@param [in] rule The rule to apply. Current rules:
|
||||||
@li ISNUM - checks if the variable is numeric
|
@li ISNUM - checks if the variable is numeric
|
||||||
@li LIBDS - matches LIBREF.DATASET format
|
@li LIBDS - matches LIBREF.DATASET format
|
||||||
|
@li FORMAT - checks if the provided format is syntactically valid
|
||||||
@param [out] outcol The variable to create, with the results of the match
|
@param [out] outcol The variable to create, with the results of the match
|
||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@@ -9677,6 +9937,20 @@ alter table &libds modify &var char(&len);
|
|||||||
if prxmatch(&tempcol, trim(&incol)) then &outcol=1;
|
if prxmatch(&tempcol, trim(&incol)) then &outcol=1;
|
||||||
else &outcol=0;
|
else &outcol=0;
|
||||||
%end;
|
%end;
|
||||||
|
%else %if &rule=FORMAT %then %do;
|
||||||
|
/* match valid format - regex could probably be improved */
|
||||||
|
if _n_=1 then do;
|
||||||
|
retain &tempcol;
|
||||||
|
&tempcol=prxparse('/^[_a-z\$]\w{0,31}\.[0-9]*$/i');
|
||||||
|
if missing(&tempcol) then do;
|
||||||
|
putlog "%str(ERR)OR: Invalid expression for FORMAT";
|
||||||
|
stop;
|
||||||
|
end;
|
||||||
|
drop &tempcol;
|
||||||
|
end;
|
||||||
|
if prxmatch(&tempcol, trim(&incol)) then &outcol=1;
|
||||||
|
else &outcol=0;
|
||||||
|
%end;
|
||||||
|
|
||||||
%mend mp_validatecol;
|
%mend mp_validatecol;
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -7,8 +7,12 @@
|
|||||||
|
|
||||||
%put %mf_existvar(work.someds, somevar)
|
%put %mf_existvar(work.someds, somevar)
|
||||||
|
|
||||||
@param libds (positional) - 2 part dataset or view reference
|
@param [in] libds 2 part dataset or view reference
|
||||||
@param var (positional) - variable name
|
@param [in] var variable name
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mf_existvar.test.sas
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
**/
|
**/
|
||||||
|
|||||||
@@ -12,9 +12,10 @@
|
|||||||
contributors of Chris Hemedingers blog [post](
|
contributors of Chris Hemedingers blog [post](
|
||||||
http://blogs.sas.com/content/sasdummy/2013/06/04/find-a-sas-library-engine/)
|
http://blogs.sas.com/content/sasdummy/2013/06/04/find-a-sas-library-engine/)
|
||||||
|
|
||||||
@param libref Library reference (also accepts a 2 level libds ref).
|
@param [in] libref Library reference (also accepts a 2 level libds ref).
|
||||||
|
|
||||||
@return output returns the library engine for the FIRST library encountered.
|
@return output returns the library engine (uppercase) for the FIRST library
|
||||||
|
encountered.
|
||||||
|
|
||||||
@warning will only return the FIRST library engine - for concatenated
|
@warning will only return the FIRST library engine - for concatenated
|
||||||
libraries, with different engines, inconsistent results may be encountered.
|
libraries, with different engines, inconsistent results may be encountered.
|
||||||
@@ -46,7 +47,7 @@
|
|||||||
%let rc= %sysfunc(close(&dsid));
|
%let rc= %sysfunc(close(&dsid));
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
&engine
|
%upcase(&engine)
|
||||||
|
|
||||||
%mend mf_getengine;
|
%mend mf_getengine;
|
||||||
|
|
||||||
|
|||||||
67
base/mf_writefile.sas
Normal file
67
base/mf_writefile.sas
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Creates a text file using pure macro
|
||||||
|
@details Creates a text file of up to 10 lines. If further lines are
|
||||||
|
desired, feel free to [create an issue](
|
||||||
|
https://github.com/sasjs/core/issues/new), or make a pull request!
|
||||||
|
|
||||||
|
The use of PARMBUFF was considered for this macro, but it would have made
|
||||||
|
things problematic for writing lines containing commas.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content)
|
||||||
|
data _null_;
|
||||||
|
infile "&sasjswork/myfile.txt";
|
||||||
|
input;
|
||||||
|
list;
|
||||||
|
run;
|
||||||
|
|
||||||
|
@param [in] fpath Full path to file to be created or appended to
|
||||||
|
@param [in] mode= (O) Available options are A or O as follows:
|
||||||
|
@li A APPEND mode, writes new records after the current end of the file.
|
||||||
|
@li O OUTPUT mode, writes new records from the beginning of the file.
|
||||||
|
@param [in] l1= First line
|
||||||
|
@param [in] l2= Second line (etc through to l10)
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mf_writefile.test.sas
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
**/
|
||||||
|
/** @cond */
|
||||||
|
|
||||||
|
%macro mf_writefile(fpath,mode=O,l1=,l2=,l3=,l4=,l5=,l6=,l7=,l8=,l9=,l10=
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
%local fref rc fid i total_lines;
|
||||||
|
|
||||||
|
/* find number of lines by reference to first non-blank param */
|
||||||
|
%do i=10 %to 1 %by -1;
|
||||||
|
%if %str(&&l&i) ne %str() %then %goto continue;
|
||||||
|
%end;
|
||||||
|
%continue:
|
||||||
|
%let total_lines=&i;
|
||||||
|
|
||||||
|
%if %sysfunc(filename(fref,&fpath)) ne 0 %then %do;
|
||||||
|
%put &=fref &=fpath;
|
||||||
|
%put %str(ERR)OR: %sysfunc(sysmsg());
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%let fid=%sysfunc(fopen(&fref,&mode));
|
||||||
|
|
||||||
|
%if &fid=0 %then %do;
|
||||||
|
%put %str(ERR)OR: %sysfunc(sysmsg());
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%do i=1 %to &total_lines;
|
||||||
|
%let rc=%sysfunc(fput(&fid, &&l&i));
|
||||||
|
%let rc=%sysfunc(fwrite(&fid));
|
||||||
|
%end;
|
||||||
|
%let rc=%sysfunc(fclose(&fid));
|
||||||
|
%let rc=%sysfunc(filename(&fref));
|
||||||
|
|
||||||
|
%mend mf_writefile;
|
||||||
|
/** @endcond */
|
||||||
181
base/mp_applyformats.sas
Normal file
181
base/mp_applyformats.sas
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Apply a set of formats to a table
|
||||||
|
@details Applies a set of formats to one or more SAS datasets. Can be used
|
||||||
|
to migrate formats from one table to another. The input table must contain
|
||||||
|
the following columns:
|
||||||
|
|
||||||
|
@li lib - the libref of the table to be updated
|
||||||
|
@li ds - the dataset to be updated
|
||||||
|
@li var - the variable to be updated
|
||||||
|
@li fmt - the format to apply. Missing or default ($CHAR, 8.) formats are
|
||||||
|
ignored.
|
||||||
|
|
||||||
|
The macro will abort in the following scenarios:
|
||||||
|
|
||||||
|
@li Libref not assigned
|
||||||
|
@li Dataset does not exist
|
||||||
|
@li Input table contains null or invalid values
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
data work.example;
|
||||||
|
set sashelp.prdsale;
|
||||||
|
format _all_ clear;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_getcols(sashelp.prdsale,outds=work.cols)
|
||||||
|
|
||||||
|
data work.cols2;
|
||||||
|
set work.cols;
|
||||||
|
lib='WORK';
|
||||||
|
ds='EXAMPLE';
|
||||||
|
var=name;
|
||||||
|
fmt=format;
|
||||||
|
keep lib ds var fmt;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_applyformats(work.cols2)
|
||||||
|
|
||||||
|
@param [in] inds The input dataset containing the formats to apply (and where
|
||||||
|
to apply them). Example structure:
|
||||||
|
|LIB:$8.|DS:$32.|VAR:$32.|FMT:$49.|
|
||||||
|
|---|---|---|---|
|
||||||
|
|`WORK `|`EXAMPLE `|`ACTUAL `|`DOLLAR12.2 `|
|
||||||
|
|`WORK `|`EXAMPLE `|`COUNTRY `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`DIVISION `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`MONTH `|`MONNAME3. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`PREDICT `|`DOLLAR12.2 `|
|
||||||
|
|`WORK `|`EXAMPLE `|`PRODTYPE `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`PRODUCT `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`QUARTER `|`8. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`REGION `|`$CHAR10. `|
|
||||||
|
|`WORK `|`EXAMPLE `|`YEAR `|`8. `|
|
||||||
|
|
||||||
|
@param [out] errds= (0) Provide a libds reference here to export the
|
||||||
|
error messages to a table. In this case, they will not be printed to the
|
||||||
|
log.
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_getengine.sas
|
||||||
|
@li mf_getuniquefileref.sas
|
||||||
|
@li mf_getuniquename.sas
|
||||||
|
@li mf_nobs.sas
|
||||||
|
@li mp_validatecol.sas
|
||||||
|
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_getformats.sas
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mp_applyformats(inds,errds=0
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
%local outds liblist i engine lib msg ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validations
|
||||||
|
*/
|
||||||
|
proc sort data=&inds;
|
||||||
|
by lib ds var fmt;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%if &errds=0 %then %let outds=%mf_getuniquename(prefix=mp_applyformats);
|
||||||
|
%else %let outds=&errds;
|
||||||
|
|
||||||
|
data &outds;
|
||||||
|
set &inds;
|
||||||
|
where fmt not in ('','.', '$', '$CHAR.','8.');
|
||||||
|
length msg $128;
|
||||||
|
by lib ds var fmt;
|
||||||
|
if libref(lib) ne 0 then do;
|
||||||
|
msg=catx(' ','libref',lib,'is not assigned!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
if exist(cats(lib,'.',ds)) ne 1 then do;
|
||||||
|
msg=catx(' ','libds',lib,'.',ds,'does not exist!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
%mp_validatecol(fmt,FORMAT,is_fmt)
|
||||||
|
if is_fmt=0 then do;
|
||||||
|
msg=catx(' ','format',fmt,'on libds',lib,'.',ds,'.',var,'is not valid!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if first.ds then do;
|
||||||
|
retain dsid;
|
||||||
|
dsid=open(cats(lib,'.',ds));
|
||||||
|
if dsid=0 then do;
|
||||||
|
msg=catx(' ','libds',lib,'.',ds,' could not be opened!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
if varnum(dsid,var)<1 then do;
|
||||||
|
msg=catx(' ','Variable',lib,'.',ds,'.',var,' was not found!');
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
putlog "%str(ERR)OR: " msg;
|
||||||
|
%end;
|
||||||
|
output;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if last.ds then rc=close(dsid);
|
||||||
|
run;
|
||||||
|
|
||||||
|
proc sql noprint;
|
||||||
|
select distinct lib into: liblist separated by ' ' from &inds;
|
||||||
|
%put &=liblist;
|
||||||
|
%do i=1 %to %sysfunc(countw(&liblist));
|
||||||
|
%let lib=%scan(&liblist,1);
|
||||||
|
%let engine=%mf_getengine(&lib);
|
||||||
|
%if &engine ne V9 and &engine ne BASE %then %do;
|
||||||
|
%let msg=&lib has &engine engine - formats cannot be applied;
|
||||||
|
proc sql;
|
||||||
|
insert into &outds set lib="&lib",ds="_all_",var="_all", msg="&msg" ;
|
||||||
|
%if &errds=0 %then %put %str(ERR)OR: &msg;
|
||||||
|
%end;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if %mf_nobs(&outds)>0 %then %return;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validations complete - now apply the actual formats!
|
||||||
|
*/
|
||||||
|
%let fref=%mf_getuniquefileref();
|
||||||
|
data _null_;
|
||||||
|
set &inds;
|
||||||
|
by lib ds var fmt;
|
||||||
|
where fmt not in ('','.', '$', '$CHAR.','8.');
|
||||||
|
file &fref;
|
||||||
|
if first.lib then put 'proc datasets nolist lib=' lib ';';
|
||||||
|
if first.ds then put ' modify ' ds ';';
|
||||||
|
put ' format ' var fmt ';';
|
||||||
|
if last.ds then put ' run;';
|
||||||
|
if last.lib then put 'quit;';
|
||||||
|
run;
|
||||||
|
|
||||||
|
%inc &fref/source2;
|
||||||
|
|
||||||
|
%if &errds=0 %then %do;
|
||||||
|
proc sql;
|
||||||
|
drop table &outds;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mp_applyformats;
|
||||||
@@ -48,6 +48,7 @@ https://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#
|
|||||||
|
|
||||||
|
|
||||||
<h4> Related Macros </h4>
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_applyformats.sas
|
||||||
@li mp_getformats.test.sas
|
@li mp_getformats.test.sas
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
|
|||||||
@@ -33,11 +33,15 @@
|
|||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getuniquename.sas
|
@li mf_getuniquename.sas
|
||||||
@li mf_getvarlen.sas
|
@li mf_getvarlen.sas
|
||||||
|
@li mf_getvarlist.sas
|
||||||
@li mf_islibds.sas
|
@li mf_islibds.sas
|
||||||
@li mf_nobs.sas
|
@li mf_nobs.sas
|
||||||
@li mp_getcols.sas
|
@li mp_getcols.sas
|
||||||
@li mp_getpk.sas
|
@li mp_getpk.sas
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_makedata.test.sas
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
|
||||||
@@ -69,7 +73,7 @@
|
|||||||
%mp_getpk(&lib,ds=&ds,outds=&ds1)
|
%mp_getpk(&lib,ds=&ds,outds=&ds1)
|
||||||
|
|
||||||
proc sql noprint;
|
proc sql noprint;
|
||||||
select pk_fields into: pk_fields from &ds1;
|
select coalescec(pk_fields,'_all_') into: pk_fields from &ds1;
|
||||||
|
|
||||||
data &ds2;
|
data &ds2;
|
||||||
if 0 then set &libds;
|
if 0 then set &libds;
|
||||||
@@ -78,7 +82,7 @@ data &ds2;
|
|||||||
%if &charvars ^= %then %do i=1 %to %sysfunc(countw(&charvars));
|
%if &charvars ^= %then %do i=1 %to %sysfunc(countw(&charvars));
|
||||||
%let col=%scan(&charvars,&i);
|
%let col=%scan(&charvars,&i);
|
||||||
/* create random value based on observation number and colum length */
|
/* create random value based on observation number and colum length */
|
||||||
&col=substr(put(md5(_n_),$hex32.),1,%mf_getvarlen(&libds,&col));
|
&col=repeat(put(md5(cats(_n_)),$hex32.),%mf_getvarlen(&libds,&col)/32);
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
%let numvars=%mf_getvarlist(&libds,typefilter=N);
|
%let numvars=%mf_getvarlist(&libds,typefilter=N);
|
||||||
@@ -88,6 +92,7 @@ data &ds2;
|
|||||||
%end;
|
%end;
|
||||||
output;
|
output;
|
||||||
end;
|
end;
|
||||||
|
stop;
|
||||||
run;
|
run;
|
||||||
proc sort data=&ds2 nodupkey;
|
proc sort data=&ds2 nodupkey;
|
||||||
by &pk_fields;
|
by &pk_fields;
|
||||||
|
|||||||
@@ -20,10 +20,13 @@
|
|||||||
;;;;
|
;;;;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
Tip - when contributing, use https://regex101.com to test the regex validity!
|
||||||
|
|
||||||
@param [in] incol The column to be validated
|
@param [in] incol The column to be validated
|
||||||
@param [in] rule The rule to apply. Current rules:
|
@param [in] rule The rule to apply. Current rules:
|
||||||
@li ISNUM - checks if the variable is numeric
|
@li ISNUM - checks if the variable is numeric
|
||||||
@li LIBDS - matches LIBREF.DATASET format
|
@li LIBDS - matches LIBREF.DATASET format
|
||||||
|
@li FORMAT - checks if the provided format is syntactically valid
|
||||||
@param [out] outcol The variable to create, with the results of the match
|
@param [out] outcol The variable to create, with the results of the match
|
||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@@ -62,5 +65,19 @@
|
|||||||
if prxmatch(&tempcol, trim(&incol)) then &outcol=1;
|
if prxmatch(&tempcol, trim(&incol)) then &outcol=1;
|
||||||
else &outcol=0;
|
else &outcol=0;
|
||||||
%end;
|
%end;
|
||||||
|
%else %if &rule=FORMAT %then %do;
|
||||||
|
/* match valid format - regex could probably be improved */
|
||||||
|
if _n_=1 then do;
|
||||||
|
retain &tempcol;
|
||||||
|
&tempcol=prxparse('/^[_a-z\$]\w{0,31}\.[0-9]*$/i');
|
||||||
|
if missing(&tempcol) then do;
|
||||||
|
putlog "%str(ERR)OR: Invalid expression for FORMAT";
|
||||||
|
stop;
|
||||||
|
end;
|
||||||
|
drop &tempcol;
|
||||||
|
end;
|
||||||
|
if prxmatch(&tempcol, trim(&incol)) then &outcol=1;
|
||||||
|
else &outcol=0;
|
||||||
|
%end;
|
||||||
|
|
||||||
%mend mp_validatecol;
|
%mend mp_validatecol;
|
||||||
|
|||||||
22
tests/crossplatform/mf_existvar.test.sas
Normal file
22
tests/crossplatform/mf_existvar.test.sas
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mf_existvar macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_existvar.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%mf_existvar(sashelp.class,age)=1),
|
||||||
|
desc=Checking existing var exists,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%mf_existvar(sashelp.class,isjustanumber)=0),
|
||||||
|
desc=Checking non existing var does not exist,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
74
tests/crossplatform/mf_writefile.test.sas
Normal file
74
tests/crossplatform/mf_writefile.test.sas
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mf_writefile.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_writefile.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content)
|
||||||
|
data _null_;
|
||||||
|
infile "&sasjswork/myfile.txt";
|
||||||
|
input;
|
||||||
|
if _n_=2 then call symputx('test1',_infile_);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&syscc=0),
|
||||||
|
desc=Check code ran without errors,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&test1=more content),
|
||||||
|
desc=Checking line was created,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=different content)
|
||||||
|
data _null_;
|
||||||
|
infile "&sasjswork/myfile.txt";
|
||||||
|
input;
|
||||||
|
if _n_=2 then call symputx('test2',_infile_);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&syscc=0),
|
||||||
|
desc=Check code ran without errors for test2,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&test2=different content),
|
||||||
|
desc=Checking second line was overwritten,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
%global test3 test4;
|
||||||
|
%mf_writefile(&sasjswork/myfile.txt
|
||||||
|
,mode=a
|
||||||
|
,l1=%str(aah, content)
|
||||||
|
,l2=append content
|
||||||
|
)
|
||||||
|
data _null_;
|
||||||
|
infile "&sasjswork/myfile.txt";
|
||||||
|
input;
|
||||||
|
if _n_=2 then call symputx('test3',_infile_);
|
||||||
|
if _n_=4 then call symputx('test4',_infile_);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&syscc=0),
|
||||||
|
desc=Check code ran without errors for test2,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&test3=different content),
|
||||||
|
desc=Checking second line was not overwritten,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&test4=append content),
|
||||||
|
desc=Checking fourth line was appended,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
45
tests/crossplatform/mp_applyformats.test.sas
Normal file
45
tests/crossplatform/mp_applyformats.test.sas
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mp_applyformats.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_getvarformat.sas
|
||||||
|
@li mp_applyformats.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
@li mp_getcols.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test 1 Base case
|
||||||
|
*/
|
||||||
|
|
||||||
|
data work.example;
|
||||||
|
set sashelp.prdsale;
|
||||||
|
format _all_;
|
||||||
|
run;
|
||||||
|
%let origfmt=%mf_getvarformat(work.example,month);
|
||||||
|
|
||||||
|
%mp_getcols(sashelp.prdsale,outds=work.cols)
|
||||||
|
|
||||||
|
data work.cols2;
|
||||||
|
set work.cols;
|
||||||
|
lib='WORK';
|
||||||
|
ds='EXAMPLE';
|
||||||
|
var=name;
|
||||||
|
fmt=format;
|
||||||
|
keep lib ds var fmt;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_applyformats(work.cols2)
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=("&orig_fmt"=""),
|
||||||
|
desc=Check that formats were cleared,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=("%mf_getvarformat(work.example,month)"="MONNAME3."),
|
||||||
|
desc=Check that formats were applied,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
59
tests/crossplatform/mp_makedata.test.sas
Normal file
59
tests/crossplatform/mp_makedata.test.sas
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mp_makedata.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_nobs.sas
|
||||||
|
@li mp_makedata.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test 1 - Regular makedata call
|
||||||
|
*/
|
||||||
|
|
||||||
|
proc sql;
|
||||||
|
create table work.example(
|
||||||
|
TX_FROM float format=datetime19.,
|
||||||
|
DD_TYPE char(16),
|
||||||
|
DD_SOURCE char(2048),
|
||||||
|
DD_SHORTDESC char(256),
|
||||||
|
constraint pk primary key(tx_from, dd_type,dd_source),
|
||||||
|
constraint nnn not null(DD_SHORTDESC)
|
||||||
|
);
|
||||||
|
%mp_makedata(work.example,obs=500)
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=("%mf_nobs(work.example)"="500"),
|
||||||
|
desc=Check that 500 rows were created,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
set work.example;
|
||||||
|
call symputx('lenvar',length(dd_source));
|
||||||
|
stop;
|
||||||
|
run;
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=("&lenvar"="2048"),
|
||||||
|
desc=Check that entire length of variable is populated,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
proc sql;
|
||||||
|
create table work.example2(
|
||||||
|
TX_FROM float format=datetime19.,
|
||||||
|
DD_TYPE char(16),
|
||||||
|
DD_SOURCE char(2048),
|
||||||
|
DD_SHORTDESC char(256),
|
||||||
|
some_num num
|
||||||
|
);
|
||||||
|
%mp_makedata(work.example2)
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&syscc=0),
|
||||||
|
desc=Ensure tables without keys still generate,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
@@ -59,4 +59,37 @@ run;
|
|||||||
desc=Test2 - ISNUM,
|
desc=Test2 - ISNUM,
|
||||||
test=EQUALS 4,
|
test=EQUALS 4,
|
||||||
outds=work.test_results
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test 3 - FORMAT
|
||||||
|
*/
|
||||||
|
data test3;
|
||||||
|
infile datalines4 dsd;
|
||||||
|
input;
|
||||||
|
infile=_infile_;
|
||||||
|
%mp_validatecol(infile,FORMAT,is_format)
|
||||||
|
if is_format=1;
|
||||||
|
datalines4;
|
||||||
|
$.
|
||||||
|
$format.
|
||||||
|
$format12.2
|
||||||
|
somenum.
|
||||||
|
somenum12.4
|
||||||
|
above are good
|
||||||
|
the rest are bad
|
||||||
|
%abort
|
||||||
|
1&somethingverybad.
|
||||||
|
&
|
||||||
|
+-1
|
||||||
|
.
|
||||||
|
a.A
|
||||||
|
$format12.1b
|
||||||
|
$format12.1b1
|
||||||
|
;;;;
|
||||||
|
run;
|
||||||
|
%mp_assertdsobs(work.test3,
|
||||||
|
desc=Test3 - ISFORMAT,
|
||||||
|
test=EQUALS 5,
|
||||||
|
outds=work.test_results
|
||||||
)
|
)
|
||||||
Reference in New Issue
Block a user