mirror of
https://github.com/sasjs/core.git
synced 2025-12-10 22:14:35 +00:00
130
all.sas
130
all.sas
@@ -8137,7 +8137,7 @@ options
|
||||
%put &sysmacroname: Switching to DATASTEP engine;
|
||||
%goto datastep;
|
||||
%end;
|
||||
data &tempds /view=&tempds;set &ds;
|
||||
data &tempds;set &ds;
|
||||
%if &fmt=N %then format _numeric_ best32.;;
|
||||
/* PRETTY is necessary to avoid line truncation in large files */
|
||||
proc json out=&jref pretty
|
||||
@@ -8188,7 +8188,7 @@ options
|
||||
%end;
|
||||
other = [best.];
|
||||
|
||||
data &tempds/view=&tempds;
|
||||
data &tempds;
|
||||
attrib _all_ label='';
|
||||
%do i=1 %to &numcols;
|
||||
%if &&typelong&i=char or &fmt=Y %then %do;
|
||||
@@ -8250,8 +8250,7 @@ options
|
||||
%end;
|
||||
|
||||
proc sql;
|
||||
drop view &tempds;
|
||||
drop table &colinfo;
|
||||
drop table &colinfo, &tempds;
|
||||
|
||||
%if &showmeta=YES %then %do;
|
||||
data _null_; file &jref encoding='utf-8' mod;
|
||||
@@ -13861,7 +13860,7 @@ data _null_;
|
||||
put ' %put &sysmacroname: Switching to DATASTEP engine; ';
|
||||
put ' %goto datastep; ';
|
||||
put ' %end; ';
|
||||
put ' data &tempds /view=&tempds;set &ds; ';
|
||||
put ' data &tempds;set &ds; ';
|
||||
put ' %if &fmt=N %then format _numeric_ best32.;; ';
|
||||
put ' /* PRETTY is necessary to avoid line truncation in large files */ ';
|
||||
put ' proc json out=&jref pretty ';
|
||||
@@ -13912,7 +13911,7 @@ data _null_;
|
||||
put ' %end; ';
|
||||
put ' other = [best.]; ';
|
||||
put ' ';
|
||||
put ' data &tempds/view=&tempds; ';
|
||||
put ' data &tempds; ';
|
||||
put ' attrib _all_ label=''''; ';
|
||||
put ' %do i=1 %to &numcols; ';
|
||||
put ' %if &&typelong&i=char or &fmt=Y %then %do; ';
|
||||
@@ -13974,8 +13973,7 @@ data _null_;
|
||||
put ' %end; ';
|
||||
put ' ';
|
||||
put ' proc sql; ';
|
||||
put ' drop view &tempds; ';
|
||||
put ' drop table &colinfo; ';
|
||||
put ' drop table &colinfo, &tempds; ';
|
||||
put ' ';
|
||||
put ' %if &showmeta=YES %then %do; ';
|
||||
put ' data _null_; file &jref encoding=''utf-8'' mod; ';
|
||||
@@ -19004,7 +19002,7 @@ data _null_;
|
||||
put ' %put &sysmacroname: Switching to DATASTEP engine; ';
|
||||
put ' %goto datastep; ';
|
||||
put ' %end; ';
|
||||
put ' data &tempds /view=&tempds;set &ds; ';
|
||||
put ' data &tempds;set &ds; ';
|
||||
put ' %if &fmt=N %then format _numeric_ best32.;; ';
|
||||
put ' /* PRETTY is necessary to avoid line truncation in large files */ ';
|
||||
put ' proc json out=&jref pretty ';
|
||||
@@ -19055,7 +19053,7 @@ data _null_;
|
||||
put ' %end; ';
|
||||
put ' other = [best.]; ';
|
||||
put ' ';
|
||||
put ' data &tempds/view=&tempds; ';
|
||||
put ' data &tempds; ';
|
||||
put ' attrib _all_ label=''''; ';
|
||||
put ' %do i=1 %to &numcols; ';
|
||||
put ' %if &&typelong&i=char or &fmt=Y %then %do; ';
|
||||
@@ -19117,8 +19115,7 @@ data _null_;
|
||||
put ' %end; ';
|
||||
put ' ';
|
||||
put ' proc sql; ';
|
||||
put ' drop view &tempds; ';
|
||||
put ' drop table &colinfo; ';
|
||||
put ' drop table &colinfo, &tempds; ';
|
||||
put ' ';
|
||||
put ' %if &showmeta=YES %then %do; ';
|
||||
put ' data _null_; file &jref encoding=''utf-8'' mod; ';
|
||||
@@ -23556,6 +23553,115 @@ run;
|
||||
|
||||
%mend ml_json;
|
||||
/**
|
||||
@file
|
||||
@brief Returns the type of the format
|
||||
@details
|
||||
Returns the type, eg DATE / DATETIME / TIME (based on hard-coded lookup)
|
||||
else CHAR / NUM.
|
||||
|
||||
This macro may be extended in the future to support custom formats - this
|
||||
would necessitate a call to `dosubl()` for running a proc format with cntlout.
|
||||
|
||||
The function itself takes the following (positional) parameters:
|
||||
|
||||
| PARAMETER | DESCRIPTION |
|
||||
|---|---|
|
||||
|fmtnm| Format name to be tested. Can be with or without the w.d extension.|
|
||||
|
||||
Usage:
|
||||
|
||||
%mcf_getfmttype(wrap=YES, insert_cmplib=YES)
|
||||
|
||||
data _null_;
|
||||
fmt1=mcf_getfmttype('DATE9.');
|
||||
fmt2=mcf_getfmttype('DATETIME');
|
||||
put (fmt:)(=);
|
||||
run;
|
||||
%put fmt3=%sysfunc(mcf_getfmttype(TIME9.));
|
||||
|
||||
Returns:
|
||||
|
||||
> fmt1=DATE fmt2=DATETIME
|
||||
> fmt3=TIME
|
||||
|
||||
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
|
||||
@param [out] insert_cmplib= (NO) Choose YES to insert the package into the
|
||||
CMPLIB reference.
|
||||
@param [out] lib= (work) The output library in which to create the catalog.
|
||||
@param [out] cat= (sasjs) The output catalog in which to create the package.
|
||||
@param [out] pkg= (utils) The output package in which to create the function.
|
||||
Uses a 3 part format: libref.catalog.package
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mcf_init.sas
|
||||
|
||||
<h4> Related Programs </h4>
|
||||
@li mcf_getfmttype.test.sas
|
||||
@li mp_init.sas
|
||||
|
||||
@todo "Custom Format Lookups" To enable site-specific formats, make
|
||||
use of a set of SASJS_FMTLIST_(DATATYPE) global variables.
|
||||
|
||||
**/
|
||||
|
||||
%macro mcf_getfmttype(wrap=NO
|
||||
,insert_cmplib=NO
|
||||
,lib=WORK
|
||||
,cat=SASJS
|
||||
,pkg=UTILS
|
||||
)/*/STORE SOURCE*/;
|
||||
|
||||
%if %mcf_init(mcf_getfmttype)=1 %then %return;
|
||||
|
||||
%if &wrap=YES %then %do;
|
||||
proc fcmp outlib=&lib..&cat..&pkg;
|
||||
%end;
|
||||
|
||||
function mcf_getfmttype(fmtnm $) $8;
|
||||
if substr(fmtnm,1,1)='$' then return('CHAR');
|
||||
else do;
|
||||
/* extract NAME */
|
||||
length fmt $32;
|
||||
fmt=scan(fmtnm,1,'.');
|
||||
do while (
|
||||
substr(fmt,length(fmt),1) in ('1','2','3','4','5','6','7','8','9','0')
|
||||
);
|
||||
if length(fmt)=1 then fmt='W';
|
||||
else fmt=substr(fmt,1,length(fmt)-1);
|
||||
end;
|
||||
|
||||
/* apply lookups */
|
||||
if cats(fmt) in ('DATETIME','B8601DN','B8601DN','B8601DT','B8601DT'
|
||||
,'B8601DZ','B8601DZ','DATEAMPM','DTDATE','DTMONYY','DTWKDATX','DTYEAR'
|
||||
,'DTYYQC','E8601DN','E8601DN','E8601DT','E8601DT','E8601DZ','E8601DZ')
|
||||
then return('DATETIME');
|
||||
else if fmt in ('DATE','YYMMDD','B8601DA','B8601DA','DAY','DDMMYY'
|
||||
,'DDMMYYB','DDMMYYC','DDMMYYD','DDMMYYN','DDMMYYP','DDMMYYS','DDMMYYx'
|
||||
,'DOWNAME','E8601DA','E8601DA','JULDAY','JULIAN','MMDDYY','MMDDYYB'
|
||||
,'MMDDYYC','MMDDYYD','MMDDYYN','MMDDYYP','MMDDYYS','MMDDYYx','MMYY'
|
||||
,'MMYYC','MMYYD','MMYYN','MMYYP','MMYYS','MMYYx','MONNAME','MONTH'
|
||||
,'MONYY','PDJULG','PDJULI','QTR','QTRR','WEEKDATE','WEEKDATX','WEEKDAY'
|
||||
,'WEEKU','WEEKV','WEEKW','WORDDATE','WORDDATX','YEAR','YYMM','YYMMC'
|
||||
,'YYMMD','YYMMDDB','YYMMDDC','YYMMDDD','YYMMDDN','YYMMDDP','YYMMDDS'
|
||||
,'YYMMDDx','YYMMN','YYMMP','YYMMS','YYMMx','YYMON','YYQ','YYQC','YYQD'
|
||||
,'YYQN','YYQP','YYQR','YYQRC','YYQRD','YYQRN','YYQRP','YYQRS','YYQRx'
|
||||
,'YYQS','YYQx','YYQZ') then return('DATE');
|
||||
else if fmt in ('TIME','B8601LZ','B8601LZ','B8601TM','B8601TM','B8601TZ'
|
||||
,'B8601TZ','E8601LZ','E8601LZ','E8601TM','E8601TM','E8601TZ','E8601TZ'
|
||||
,'HHMM','HOUR','MMSS','TIMEAMPM','TOD') then return('TIME');
|
||||
else return('NUM');
|
||||
end;
|
||||
endsub;
|
||||
|
||||
%if &wrap=YES %then %do;
|
||||
quit;
|
||||
%end;
|
||||
|
||||
%if &insert_cmplib=YES %then %do;
|
||||
options insert=(CMPLIB=(&lib..&cat));
|
||||
%end;
|
||||
|
||||
%mend mcf_getfmttype;/**
|
||||
@file
|
||||
@brief Sets up the mcf_xx functions
|
||||
@details
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
%put &sysmacroname: Switching to DATASTEP engine;
|
||||
%goto datastep;
|
||||
%end;
|
||||
data &tempds /view=&tempds;set &ds;
|
||||
data &tempds;set &ds;
|
||||
%if &fmt=N %then format _numeric_ best32.;;
|
||||
/* PRETTY is necessary to avoid line truncation in large files */
|
||||
proc json out=&jref pretty
|
||||
@@ -182,7 +182,7 @@
|
||||
%end;
|
||||
other = [best.];
|
||||
|
||||
data &tempds/view=&tempds;
|
||||
data &tempds;
|
||||
attrib _all_ label='';
|
||||
%do i=1 %to &numcols;
|
||||
%if &&typelong&i=char or &fmt=Y %then %do;
|
||||
@@ -244,8 +244,7 @@
|
||||
%end;
|
||||
|
||||
proc sql;
|
||||
drop view &tempds;
|
||||
drop table &colinfo;
|
||||
drop table &colinfo, &tempds;
|
||||
|
||||
%if &showmeta=YES %then %do;
|
||||
data _null_; file &jref encoding='utf-8' mod;
|
||||
|
||||
110
fcmp/mcf_getfmttype.sas
Normal file
110
fcmp/mcf_getfmttype.sas
Normal file
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
@file
|
||||
@brief Returns the type of the format
|
||||
@details
|
||||
Returns the type, eg DATE / DATETIME / TIME (based on hard-coded lookup)
|
||||
else CHAR / NUM.
|
||||
|
||||
This macro may be extended in the future to support custom formats - this
|
||||
would necessitate a call to `dosubl()` for running a proc format with cntlout.
|
||||
|
||||
The function itself takes the following (positional) parameters:
|
||||
|
||||
| PARAMETER | DESCRIPTION |
|
||||
|---|---|
|
||||
|fmtnm| Format name to be tested. Can be with or without the w.d extension.|
|
||||
|
||||
Usage:
|
||||
|
||||
%mcf_getfmttype(wrap=YES, insert_cmplib=YES)
|
||||
|
||||
data _null_;
|
||||
fmt1=mcf_getfmttype('DATE9.');
|
||||
fmt2=mcf_getfmttype('DATETIME');
|
||||
put (fmt:)(=);
|
||||
run;
|
||||
%put fmt3=%sysfunc(mcf_getfmttype(TIME9.));
|
||||
|
||||
Returns:
|
||||
|
||||
> fmt1=DATE fmt2=DATETIME
|
||||
> fmt3=TIME
|
||||
|
||||
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
|
||||
@param [out] insert_cmplib= (NO) Choose YES to insert the package into the
|
||||
CMPLIB reference.
|
||||
@param [out] lib= (work) The output library in which to create the catalog.
|
||||
@param [out] cat= (sasjs) The output catalog in which to create the package.
|
||||
@param [out] pkg= (utils) The output package in which to create the function.
|
||||
Uses a 3 part format: libref.catalog.package
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mcf_init.sas
|
||||
|
||||
<h4> Related Programs </h4>
|
||||
@li mcf_getfmttype.test.sas
|
||||
@li mp_init.sas
|
||||
|
||||
@todo "Custom Format Lookups" To enable site-specific formats, make
|
||||
use of a set of SASJS_FMTLIST_(DATATYPE) global variables.
|
||||
|
||||
**/
|
||||
|
||||
%macro mcf_getfmttype(wrap=NO
|
||||
,insert_cmplib=NO
|
||||
,lib=WORK
|
||||
,cat=SASJS
|
||||
,pkg=UTILS
|
||||
)/*/STORE SOURCE*/;
|
||||
|
||||
%if %mcf_init(mcf_getfmttype)=1 %then %return;
|
||||
|
||||
%if &wrap=YES %then %do;
|
||||
proc fcmp outlib=&lib..&cat..&pkg;
|
||||
%end;
|
||||
|
||||
function mcf_getfmttype(fmtnm $) $8;
|
||||
if substr(fmtnm,1,1)='$' then return('CHAR');
|
||||
else do;
|
||||
/* extract NAME */
|
||||
length fmt $32;
|
||||
fmt=scan(fmtnm,1,'.');
|
||||
do while (
|
||||
substr(fmt,length(fmt),1) in ('1','2','3','4','5','6','7','8','9','0')
|
||||
);
|
||||
if length(fmt)=1 then fmt='W';
|
||||
else fmt=substr(fmt,1,length(fmt)-1);
|
||||
end;
|
||||
|
||||
/* apply lookups */
|
||||
if cats(fmt) in ('DATETIME','B8601DN','B8601DN','B8601DT','B8601DT'
|
||||
,'B8601DZ','B8601DZ','DATEAMPM','DTDATE','DTMONYY','DTWKDATX','DTYEAR'
|
||||
,'DTYYQC','E8601DN','E8601DN','E8601DT','E8601DT','E8601DZ','E8601DZ')
|
||||
then return('DATETIME');
|
||||
else if fmt in ('DATE','YYMMDD','B8601DA','B8601DA','DAY','DDMMYY'
|
||||
,'DDMMYYB','DDMMYYC','DDMMYYD','DDMMYYN','DDMMYYP','DDMMYYS','DDMMYYx'
|
||||
,'DOWNAME','E8601DA','E8601DA','JULDAY','JULIAN','MMDDYY','MMDDYYB'
|
||||
,'MMDDYYC','MMDDYYD','MMDDYYN','MMDDYYP','MMDDYYS','MMDDYYx','MMYY'
|
||||
,'MMYYC','MMYYD','MMYYN','MMYYP','MMYYS','MMYYx','MONNAME','MONTH'
|
||||
,'MONYY','PDJULG','PDJULI','QTR','QTRR','WEEKDATE','WEEKDATX','WEEKDAY'
|
||||
,'WEEKU','WEEKV','WEEKW','WORDDATE','WORDDATX','YEAR','YYMM','YYMMC'
|
||||
,'YYMMD','YYMMDDB','YYMMDDC','YYMMDDD','YYMMDDN','YYMMDDP','YYMMDDS'
|
||||
,'YYMMDDx','YYMMN','YYMMP','YYMMS','YYMMx','YYMON','YYQ','YYQC','YYQD'
|
||||
,'YYQN','YYQP','YYQR','YYQRC','YYQRD','YYQRN','YYQRP','YYQRS','YYQRx'
|
||||
,'YYQS','YYQx','YYQZ') then return('DATE');
|
||||
else if fmt in ('TIME','B8601LZ','B8601LZ','B8601TM','B8601TM','B8601TZ'
|
||||
,'B8601TZ','E8601LZ','E8601LZ','E8601TM','E8601TM','E8601TZ','E8601TZ'
|
||||
,'HHMM','HOUR','MMSS','TIMEAMPM','TOD') then return('TIME');
|
||||
else return('NUM');
|
||||
end;
|
||||
endsub;
|
||||
|
||||
%if &wrap=YES %then %do;
|
||||
quit;
|
||||
%end;
|
||||
|
||||
%if &insert_cmplib=YES %then %do;
|
||||
options insert=(CMPLIB=(&lib..&cat));
|
||||
%end;
|
||||
|
||||
%mend mcf_getfmttype;
|
||||
@@ -164,7 +164,7 @@ data _null_;
|
||||
put ' %put &sysmacroname: Switching to DATASTEP engine; ';
|
||||
put ' %goto datastep; ';
|
||||
put ' %end; ';
|
||||
put ' data &tempds /view=&tempds;set &ds; ';
|
||||
put ' data &tempds;set &ds; ';
|
||||
put ' %if &fmt=N %then format _numeric_ best32.;; ';
|
||||
put ' /* PRETTY is necessary to avoid line truncation in large files */ ';
|
||||
put ' proc json out=&jref pretty ';
|
||||
@@ -215,7 +215,7 @@ data _null_;
|
||||
put ' %end; ';
|
||||
put ' other = [best.]; ';
|
||||
put ' ';
|
||||
put ' data &tempds/view=&tempds; ';
|
||||
put ' data &tempds; ';
|
||||
put ' attrib _all_ label=''''; ';
|
||||
put ' %do i=1 %to &numcols; ';
|
||||
put ' %if &&typelong&i=char or &fmt=Y %then %do; ';
|
||||
@@ -277,8 +277,7 @@ data _null_;
|
||||
put ' %end; ';
|
||||
put ' ';
|
||||
put ' proc sql; ';
|
||||
put ' drop view &tempds; ';
|
||||
put ' drop table &colinfo; ';
|
||||
put ' drop table &colinfo, &tempds; ';
|
||||
put ' ';
|
||||
put ' %if &showmeta=YES %then %do; ';
|
||||
put ' data _null_; file &jref encoding=''utf-8'' mod; ';
|
||||
|
||||
39
tests/crossplatform/mcf_getfmttype.test.sas
Normal file
39
tests/crossplatform/mcf_getfmttype.test.sas
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mcf_getfmttype.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mcf_getfmttype.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mcf_getfmttype(wrap=YES, insert_cmplib=YES)
|
||||
%mp_assertscope(COMPARE,ignorelist=SASJS_FUNCTIONS)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(mcf_getfmttype(DATE9.))=DATE),
|
||||
desc=Check DATE format
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(mcf_getfmttype($6))=CHAR),
|
||||
desc=Check CHAR format
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(mcf_getfmttype(8.))=NUM),
|
||||
desc=Check NUM format
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(mcf_getfmttype(E8601DT))=DATETIME),
|
||||
desc=Check DATETIME format
|
||||
)
|
||||
|
||||
/* test 2 - compile again test for warnings */
|
||||
%mcf_getfmttype(wrap=YES, insert_cmplib=YES)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Check syscc=0 after re-initialisation
|
||||
)
|
||||
@@ -308,7 +308,7 @@ data _null_;
|
||||
put ' %put &sysmacroname: Switching to DATASTEP engine; ';
|
||||
put ' %goto datastep; ';
|
||||
put ' %end; ';
|
||||
put ' data &tempds /view=&tempds;set &ds; ';
|
||||
put ' data &tempds;set &ds; ';
|
||||
put ' %if &fmt=N %then format _numeric_ best32.;; ';
|
||||
put ' /* PRETTY is necessary to avoid line truncation in large files */ ';
|
||||
put ' proc json out=&jref pretty ';
|
||||
@@ -359,7 +359,7 @@ data _null_;
|
||||
put ' %end; ';
|
||||
put ' other = [best.]; ';
|
||||
put ' ';
|
||||
put ' data &tempds/view=&tempds; ';
|
||||
put ' data &tempds; ';
|
||||
put ' attrib _all_ label=''''; ';
|
||||
put ' %do i=1 %to &numcols; ';
|
||||
put ' %if &&typelong&i=char or &fmt=Y %then %do; ';
|
||||
@@ -421,8 +421,7 @@ data _null_;
|
||||
put ' %end; ';
|
||||
put ' ';
|
||||
put ' proc sql; ';
|
||||
put ' drop view &tempds; ';
|
||||
put ' drop table &colinfo; ';
|
||||
put ' drop table &colinfo, &tempds; ';
|
||||
put ' ';
|
||||
put ' %if &showmeta=YES %then %do; ';
|
||||
put ' data _null_; file &jref encoding=''utf-8'' mod; ';
|
||||
|
||||
Reference in New Issue
Block a user