mirror of
https://github.com/sasjs/core.git
synced 2026-01-04 08:00:05 +00:00
feat: new mp_ds2fmtds macro - converts a dataset to a new dataset where all values are the formatted values. Also added a test.
This commit is contained in:
98
all.sas
98
all.sas
@@ -801,8 +801,8 @@ options noquotelenmax;
|
|||||||
|
|
||||||
|
|
||||||
%macro mf_getuniquename(prefix=MC);
|
%macro mf_getuniquename(prefix=MC);
|
||||||
&prefix.%substr(%sysfunc(compress(%sysfunc(uuidgen()),-)),1,32-%length(&prefix))
|
&prefix.%substr(%sysfunc(compress(%sysfunc(uuidgen()),-)),1,32-%length(&prefix))
|
||||||
%mend;/**
|
%mend mf_getuniquename;/**
|
||||||
@file
|
@file
|
||||||
@brief Returns a userid according to session context
|
@brief Returns a userid according to session context
|
||||||
@details In a workspace session, a user is generally represented by <code>
|
@details In a workspace session, a user is generally represented by <code>
|
||||||
@@ -3254,6 +3254,100 @@ run;
|
|||||||
|
|
||||||
|
|
||||||
%mend;/**
|
%mend;/**
|
||||||
|
@file
|
||||||
|
@brief Converts every value in a dataset to it's formatted value
|
||||||
|
@details Converts every value to it's formatted value. All variables will
|
||||||
|
become character, and will be in the same order.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mp_ds2fmtds(sashelp.cars,work.cards)
|
||||||
|
|
||||||
|
@param [in] libds The library.dataset to be converted
|
||||||
|
@param [out] outds The dataset to create.
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mp_ds2fmtds(libds, outds
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
/* validations */
|
||||||
|
%if not %sysfunc(exist(&libds)) %then %do;
|
||||||
|
%put %str(WARN)ING: &libds does not exist;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
%if %index(&libds,.)=0 %then %let libds=WORK.&libds;
|
||||||
|
|
||||||
|
/* grab metadata */
|
||||||
|
proc contents noprint data=&libds
|
||||||
|
out=_data_(keep=name type length format formatl formatd varnum);
|
||||||
|
run;
|
||||||
|
proc sort;
|
||||||
|
by varnum;
|
||||||
|
run;
|
||||||
|
|
||||||
|
/* prepare formats and varnames */
|
||||||
|
data _null_;
|
||||||
|
set &syslast end=last;
|
||||||
|
name=upcase(name);
|
||||||
|
/* fix formats */
|
||||||
|
if type=2 or type=6 then do;
|
||||||
|
length fmt $49.;
|
||||||
|
if format='' then fmt=cats('$',length,'.');
|
||||||
|
else if formatl=0 then fmt=cats(format,'.');
|
||||||
|
else fmt=cats(format,formatl,'.');
|
||||||
|
newlen=max(formatl,length);
|
||||||
|
end;
|
||||||
|
else do;
|
||||||
|
if format='' then fmt='best.';
|
||||||
|
else if formatl=0 then fmt=cats(format,'.');
|
||||||
|
else if formatd=0 then fmt=cats(format,formatl,'.');
|
||||||
|
else fmt=cats(format,formatl,'.',formatd);
|
||||||
|
/* needs to be wide, for datetimes etc */
|
||||||
|
newlen=max(length,formatl,24);
|
||||||
|
end;
|
||||||
|
/* 32 char unique name */
|
||||||
|
newname='sasjs'!!substr(cats(put(md5(name),$hex32.)),1,27);
|
||||||
|
|
||||||
|
call symputx(cats('name',_n_),name,'l');
|
||||||
|
call symputx(cats('newname',_n_),newname,'l');
|
||||||
|
call symputx(cats('len',_n_),newlen,'l');
|
||||||
|
call symputx(cats('fmt',_n_),fmt,'l');
|
||||||
|
call symputx(cats('type',_n_),type,'l');
|
||||||
|
if last then call symputx('nobs',_n_,'l');
|
||||||
|
run;
|
||||||
|
|
||||||
|
/* clean up */
|
||||||
|
proc sql;
|
||||||
|
drop table &syslast;
|
||||||
|
|
||||||
|
%if &nobs=0 %then %do;
|
||||||
|
%put Dataset &libds has no columns!
|
||||||
|
data &outds;
|
||||||
|
set &libds;
|
||||||
|
run;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
data &outds;
|
||||||
|
/* rename on entry */
|
||||||
|
set &libds(rename=(
|
||||||
|
%local i;
|
||||||
|
%do i=1 %to &nobs;
|
||||||
|
&&name&i=&&newname&i
|
||||||
|
%end;
|
||||||
|
));
|
||||||
|
%do i=1 %to &nobs;
|
||||||
|
length &&name&i $&&len&i;
|
||||||
|
&&name&i=left(put(&&newname&i,&&fmt&i));
|
||||||
|
drop &&newname&i;
|
||||||
|
%end;
|
||||||
|
if _error_ then call symputx('syscc',1012);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mend mp_ds2fmtds;/**
|
||||||
@file
|
@file
|
||||||
@brief Checks an input filter table for validity
|
@brief Checks an input filter table for validity
|
||||||
@details Performs checks on the input table to ensure it arrives in the
|
@details Performs checks on the input table to ensure it arrives in the
|
||||||
|
|||||||
@@ -18,5 +18,5 @@
|
|||||||
|
|
||||||
|
|
||||||
%macro mf_getuniquename(prefix=MC);
|
%macro mf_getuniquename(prefix=MC);
|
||||||
&prefix.%substr(%sysfunc(compress(%sysfunc(uuidgen()),-)),1,32-%length(&prefix))
|
&prefix.%substr(%sysfunc(compress(%sysfunc(uuidgen()),-)),1,32-%length(&prefix))
|
||||||
%mend;
|
%mend mf_getuniquename;
|
||||||
95
base/mp_ds2fmtds.sas
Normal file
95
base/mp_ds2fmtds.sas
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Converts every value in a dataset to it's formatted value
|
||||||
|
@details Converts every value to it's formatted value. All variables will
|
||||||
|
become character, and will be in the same order.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mp_ds2fmtds(sashelp.cars,work.cards)
|
||||||
|
|
||||||
|
@param [in] libds The library.dataset to be converted
|
||||||
|
@param [out] outds The dataset to create.
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mp_ds2fmtds(libds, outds
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
/* validations */
|
||||||
|
%if not %sysfunc(exist(&libds)) %then %do;
|
||||||
|
%put %str(WARN)ING: &libds does not exist;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
%if %index(&libds,.)=0 %then %let libds=WORK.&libds;
|
||||||
|
|
||||||
|
/* grab metadata */
|
||||||
|
proc contents noprint data=&libds
|
||||||
|
out=_data_(keep=name type length format formatl formatd varnum);
|
||||||
|
run;
|
||||||
|
proc sort;
|
||||||
|
by varnum;
|
||||||
|
run;
|
||||||
|
|
||||||
|
/* prepare formats and varnames */
|
||||||
|
data _null_;
|
||||||
|
set &syslast end=last;
|
||||||
|
name=upcase(name);
|
||||||
|
/* fix formats */
|
||||||
|
if type=2 or type=6 then do;
|
||||||
|
length fmt $49.;
|
||||||
|
if format='' then fmt=cats('$',length,'.');
|
||||||
|
else if formatl=0 then fmt=cats(format,'.');
|
||||||
|
else fmt=cats(format,formatl,'.');
|
||||||
|
newlen=max(formatl,length);
|
||||||
|
end;
|
||||||
|
else do;
|
||||||
|
if format='' then fmt='best.';
|
||||||
|
else if formatl=0 then fmt=cats(format,'.');
|
||||||
|
else if formatd=0 then fmt=cats(format,formatl,'.');
|
||||||
|
else fmt=cats(format,formatl,'.',formatd);
|
||||||
|
/* needs to be wide, for datetimes etc */
|
||||||
|
newlen=max(length,formatl,24);
|
||||||
|
end;
|
||||||
|
/* 32 char unique name */
|
||||||
|
newname='sasjs'!!substr(cats(put(md5(name),$hex32.)),1,27);
|
||||||
|
|
||||||
|
call symputx(cats('name',_n_),name,'l');
|
||||||
|
call symputx(cats('newname',_n_),newname,'l');
|
||||||
|
call symputx(cats('len',_n_),newlen,'l');
|
||||||
|
call symputx(cats('fmt',_n_),fmt,'l');
|
||||||
|
call symputx(cats('type',_n_),type,'l');
|
||||||
|
if last then call symputx('nobs',_n_,'l');
|
||||||
|
run;
|
||||||
|
|
||||||
|
/* clean up */
|
||||||
|
proc sql;
|
||||||
|
drop table &syslast;
|
||||||
|
|
||||||
|
%if &nobs=0 %then %do;
|
||||||
|
%put Dataset &libds has no columns!
|
||||||
|
data &outds;
|
||||||
|
set &libds;
|
||||||
|
run;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
data &outds;
|
||||||
|
/* rename on entry */
|
||||||
|
set &libds(rename=(
|
||||||
|
%local i;
|
||||||
|
%do i=1 %to &nobs;
|
||||||
|
&&name&i=&&newname&i
|
||||||
|
%end;
|
||||||
|
));
|
||||||
|
%do i=1 %to &nobs;
|
||||||
|
length &&name&i $&&len&i;
|
||||||
|
&&name&i=left(put(&&newname&i,&&fmt&i));
|
||||||
|
drop &&newname&i;
|
||||||
|
%end;
|
||||||
|
if _error_ then call symputx('syscc',1012);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mend mp_ds2fmtds;
|
||||||
28
tests/base/mp_ds2fmtds.test.sas
Normal file
28
tests/base/mp_ds2fmtds.test.sas
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mp_ds2fmtds.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mp_ds2fmtds.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
proc sql;
|
||||||
|
create table test as select * from dictionary.tables where libname='SASHELP';
|
||||||
|
|
||||||
|
filename inc temp;
|
||||||
|
data _null_;
|
||||||
|
set work.test;
|
||||||
|
file inc;
|
||||||
|
line=cats('%mp_ds2fmtds(sashelp.',memname,',',memname,')');
|
||||||
|
put line;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%inc inc;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&syscc=0),
|
||||||
|
desc=Checking tables were created successfully,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user