mirror of
https://github.com/sasjs/core.git
synced 2025-12-18 01:04:35 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cc7cc55022 | |||
| 15687be5d6 | |||
| d9a82c0bdf |
121
all.sas
121
all.sas
@@ -1904,6 +1904,113 @@ Usage:
|
||||
|
||||
%mend;
|
||||
/**
|
||||
@file mp_csv2ds.sas
|
||||
@brief Efficient import of arbitrary CSV using a dataset as template
|
||||
@details Used to import relevant columns from a large CSV using
|
||||
a dataset to provide the types and lengths. Assumes that a header
|
||||
row is provided, and datarows start on line 2. Extra columns in
|
||||
both the CSV and base dataset are ignored.
|
||||
|
||||
Usage:
|
||||
|
||||
filename mycsv temp;
|
||||
data _null_;
|
||||
file mycsv;
|
||||
put 'name,age,nickname';
|
||||
put 'John,48,Jonny';
|
||||
put 'Jennifer,23,Jen';
|
||||
run;
|
||||
|
||||
%mp_csv2ds(inref=mycsv,outds=myds,baseds=sashelp.class)
|
||||
|
||||
|
||||
@param inref= fileref to the CSV
|
||||
@param outds= output ds. Could also be a view (eg `outds=myds/view=myds`)
|
||||
@param baseds= Template dataset on which to create the input statement.
|
||||
Is used to determine types, lengths, and any informats.
|
||||
|
||||
@version 9.2
|
||||
@author Allan Bowe
|
||||
**/
|
||||
|
||||
%macro mp_csv2ds(inref=0,outds=0,baseds=0);
|
||||
%if &inref=0 %then %do;
|
||||
%put %str(ERR)OR: the INREF variable must be provided;
|
||||
%let syscc=4;
|
||||
%abort;
|
||||
%end;
|
||||
%if &outds=0 %then %do;
|
||||
%put %str(ERR)OR: the OUTDS variable must be provided;
|
||||
%let syscc=4;
|
||||
%return;
|
||||
%end;
|
||||
%if &baseds=0 %then %do;
|
||||
%put %str(ERR)OR: the BASEDS variable must be provided;
|
||||
%let syscc=4;
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* get the variables in the CSV */
|
||||
data _data_;
|
||||
infile &inref;
|
||||
input;
|
||||
length name $32;
|
||||
do i=1 to countc(_infile_,',')+1;
|
||||
name=upcase(scan(_infile_,i,','));
|
||||
output;
|
||||
end;
|
||||
stop;
|
||||
run;
|
||||
%local csv_vars;%let csv_vars=&syslast;
|
||||
|
||||
/* get the variables in the dataset */
|
||||
proc contents noprint data=&baseds
|
||||
out=_data_ (keep=name type length format: informat);
|
||||
run;
|
||||
%local base_vars; %let base_vars=&syslast;
|
||||
|
||||
proc sql undo_policy=none;
|
||||
create table &csv_vars as
|
||||
select a.*
|
||||
,b.type
|
||||
,b.length
|
||||
,b.format
|
||||
,b.formatd
|
||||
,b.formatl
|
||||
,b.informat
|
||||
from &csv_vars a
|
||||
left join &base_vars b
|
||||
on a.name=upcase(b.name)
|
||||
order by i;
|
||||
|
||||
/* prepare the input statement */
|
||||
%local instat dropvars;
|
||||
data _null_;
|
||||
set &syslast end=last;
|
||||
length in dropvars $32767;
|
||||
retain in dropvars;
|
||||
if missing(type) then do;
|
||||
informat='$1.';
|
||||
dropvars=catx(' ',dropvars,name);
|
||||
end;
|
||||
else if missing(informat) then do;
|
||||
if type=1 then informat='best.';
|
||||
else informat=cats('$',length,'.');
|
||||
end;
|
||||
in=catx(' ',in,name,':',informat);
|
||||
if last then do;
|
||||
call symputx('instat',in,'l');
|
||||
call symputx('dropvars',dropvars,'l');
|
||||
end;
|
||||
run;
|
||||
|
||||
data &outds;
|
||||
infile &inref dsd firstobs=2;
|
||||
input &instat;
|
||||
drop &dropvars;
|
||||
run;
|
||||
|
||||
%mend;/**
|
||||
@file mp_deleteconstraints.sas
|
||||
@brief Delete constraionts
|
||||
@details Takes the output from mp_getconstraints.sas as input
|
||||
@@ -2041,7 +2148,8 @@ data &outds (compress=no keep=file_or_folder filepath filename ext msg directory
|
||||
dnum = dnum(did);
|
||||
do i = 1 to dnum;
|
||||
filename = dread(did, i);
|
||||
rc = filename(fref2, cats(directory,'/',filename));
|
||||
filepath=cats(directory,'/',filename);
|
||||
rc = filename(fref2,filepath);
|
||||
midd=dopen(fref2);
|
||||
dmsg=sysmsg();
|
||||
if did > 0 then file_or_folder='folder';
|
||||
@@ -2064,7 +2172,6 @@ data &outds (compress=no keep=file_or_folder filepath filename ext msg directory
|
||||
ext='';
|
||||
file_or_folder='folder';
|
||||
end;
|
||||
filepath="&path/"!!filename;
|
||||
output;
|
||||
end;
|
||||
rc = dclose(did);
|
||||
@@ -2642,7 +2749,7 @@ run;
|
||||
%let curds=%scan(&dsnlist,&x);
|
||||
data _null_;
|
||||
file &fref mod;
|
||||
length nm lab $1024;
|
||||
length nm lab $1024 typ $20;
|
||||
set &colinfo (where=(upcase(memname)="&curds")) end=last;
|
||||
|
||||
if _n_=1 then do;
|
||||
@@ -2656,10 +2763,12 @@ run;
|
||||
end;
|
||||
else put " ,"@@;
|
||||
if length(format)>1 then fmt=" format="!!cats(format);
|
||||
len=" length="!!cats(length);
|
||||
lab=" label="!!quote(trim(label));
|
||||
if length(label)>1 then lab=" label="!!quote(trim(label));
|
||||
if notnull='yes' then notnul=' not null';
|
||||
put name type len fmt notnul lab;
|
||||
if type='char' then typ=cats('char(',length,')');
|
||||
else if length ne 8 then typ='num length='!!left(length);
|
||||
else typ='num';
|
||||
put name typ fmt notnul lab;
|
||||
run;
|
||||
|
||||
/* Extra step for data constraints */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@brief Returns the engine type of a SAS library
|
||||
@details Usage:
|
||||
|
||||
%put %mf_getEngine(SASHELP);
|
||||
%put %mf_getengine(SASHELP);
|
||||
|
||||
returns:
|
||||
> V9
|
||||
@@ -21,9 +21,10 @@
|
||||
|
||||
@version 9.2
|
||||
@author Allan Bowe
|
||||
**/
|
||||
|
||||
%macro mf_getEngine(libref
|
||||
**/ /** \cond */
|
||||
|
||||
%macro mf_getengine(libref
|
||||
)/*/STORE SOURCE*/;
|
||||
%local dsid engnum rc engine;
|
||||
|
||||
@@ -42,3 +43,5 @@
|
||||
&engine
|
||||
|
||||
%mend;
|
||||
|
||||
/** \endcond */
|
||||
109
base/mp_csv2ds.sas
Normal file
109
base/mp_csv2ds.sas
Normal file
@@ -0,0 +1,109 @@
|
||||
/**
|
||||
@file mp_csv2ds.sas
|
||||
@brief Efficient import of arbitrary CSV using a dataset as template
|
||||
@details Used to import relevant columns from a large CSV using
|
||||
a dataset to provide the types and lengths. Assumes that a header
|
||||
row is provided, and datarows start on line 2. Extra columns in
|
||||
both the CSV and base dataset are ignored.
|
||||
|
||||
Usage:
|
||||
|
||||
filename mycsv temp;
|
||||
data _null_;
|
||||
file mycsv;
|
||||
put 'name,age,nickname';
|
||||
put 'John,48,Jonny';
|
||||
put 'Jennifer,23,Jen';
|
||||
run;
|
||||
|
||||
%mp_csv2ds(inref=mycsv,outds=myds,baseds=sashelp.class)
|
||||
|
||||
|
||||
@param inref= fileref to the CSV
|
||||
@param outds= output ds. Could also be a view (eg `outds=myds/view=myds`)
|
||||
@param baseds= Template dataset on which to create the input statement.
|
||||
Is used to determine types, lengths, and any informats.
|
||||
|
||||
@version 9.2
|
||||
@author Allan Bowe
|
||||
**/
|
||||
|
||||
%macro mp_csv2ds(inref=0,outds=0,baseds=0);
|
||||
%if &inref=0 %then %do;
|
||||
%put %str(ERR)OR: the INREF variable must be provided;
|
||||
%let syscc=4;
|
||||
%abort;
|
||||
%end;
|
||||
%if &outds=0 %then %do;
|
||||
%put %str(ERR)OR: the OUTDS variable must be provided;
|
||||
%let syscc=4;
|
||||
%return;
|
||||
%end;
|
||||
%if &baseds=0 %then %do;
|
||||
%put %str(ERR)OR: the BASEDS variable must be provided;
|
||||
%let syscc=4;
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* get the variables in the CSV */
|
||||
data _data_;
|
||||
infile &inref;
|
||||
input;
|
||||
length name $32;
|
||||
do i=1 to countc(_infile_,',')+1;
|
||||
name=upcase(scan(_infile_,i,','));
|
||||
output;
|
||||
end;
|
||||
stop;
|
||||
run;
|
||||
%local csv_vars;%let csv_vars=&syslast;
|
||||
|
||||
/* get the variables in the dataset */
|
||||
proc contents noprint data=&baseds
|
||||
out=_data_ (keep=name type length format: informat);
|
||||
run;
|
||||
%local base_vars; %let base_vars=&syslast;
|
||||
|
||||
proc sql undo_policy=none;
|
||||
create table &csv_vars as
|
||||
select a.*
|
||||
,b.type
|
||||
,b.length
|
||||
,b.format
|
||||
,b.formatd
|
||||
,b.formatl
|
||||
,b.informat
|
||||
from &csv_vars a
|
||||
left join &base_vars b
|
||||
on a.name=upcase(b.name)
|
||||
order by i;
|
||||
|
||||
/* prepare the input statement */
|
||||
%local instat dropvars;
|
||||
data _null_;
|
||||
set &syslast end=last;
|
||||
length in dropvars $32767;
|
||||
retain in dropvars;
|
||||
if missing(type) then do;
|
||||
informat='$1.';
|
||||
dropvars=catx(' ',dropvars,name);
|
||||
end;
|
||||
else if missing(informat) then do;
|
||||
if type=1 then informat='best.';
|
||||
else informat=cats('$',length,'.');
|
||||
end;
|
||||
in=catx(' ',in,name,':',informat);
|
||||
if last then do;
|
||||
call symputx('instat',in,'l');
|
||||
call symputx('dropvars',dropvars,'l');
|
||||
end;
|
||||
run;
|
||||
|
||||
/* import the CSV */
|
||||
data &outds;
|
||||
infile &inref dsd firstobs=2;
|
||||
input &instat;
|
||||
drop &dropvars;
|
||||
run;
|
||||
|
||||
%mend;
|
||||
@@ -85,7 +85,8 @@ data &outds (compress=no keep=file_or_folder filepath filename ext msg directory
|
||||
dnum = dnum(did);
|
||||
do i = 1 to dnum;
|
||||
filename = dread(did, i);
|
||||
rc = filename(fref2, cats(directory,'/',filename));
|
||||
filepath=cats(directory,'/',filename);
|
||||
rc = filename(fref2,filepath);
|
||||
midd=dopen(fref2);
|
||||
dmsg=sysmsg();
|
||||
if did > 0 then file_or_folder='folder';
|
||||
@@ -108,7 +109,6 @@ data &outds (compress=no keep=file_or_folder filepath filename ext msg directory
|
||||
ext='';
|
||||
file_or_folder='folder';
|
||||
end;
|
||||
filepath="&path/"!!filename;
|
||||
output;
|
||||
end;
|
||||
rc = dclose(did);
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
datetime2 format or regular decimal type
|
||||
@version 9.3
|
||||
@author Allan Bowe
|
||||
@source https://github.com/sasjs/core
|
||||
**/
|
||||
|
||||
%macro mp_getddl(libref,ds,fref=getddl,flavour=SAS,showlog=NO,schema=
|
||||
@@ -132,7 +131,7 @@ run;
|
||||
%let curds=%scan(&dsnlist,&x);
|
||||
data _null_;
|
||||
file &fref mod;
|
||||
length nm lab $1024;
|
||||
length nm lab $1024 typ $20;
|
||||
set &colinfo (where=(upcase(memname)="&curds")) end=last;
|
||||
|
||||
if _n_=1 then do;
|
||||
@@ -146,10 +145,12 @@ run;
|
||||
end;
|
||||
else put " ,"@@;
|
||||
if length(format)>1 then fmt=" format="!!cats(format);
|
||||
len=" length="!!cats(length);
|
||||
lab=" label="!!quote(trim(label));
|
||||
if length(label)>1 then lab=" label="!!quote(trim(label));
|
||||
if notnull='yes' then notnul=' not null';
|
||||
put name type len fmt notnul lab;
|
||||
if type='char' then typ=cats('char(',length,')');
|
||||
else if length ne 8 then typ='num length='!!left(length);
|
||||
else typ='num';
|
||||
put name typ fmt notnul lab;
|
||||
run;
|
||||
|
||||
/* Extra step for data constraints */
|
||||
|
||||
Reference in New Issue
Block a user