Currently the user is forced to examine the max values in the numeric columns and generate the DATA STEP import code from the SAS metadata, switching the columns with max values larger than the limit to character. Code I used is below:
proc import datafile = "&dir_fn"
out = csv_to_sas replace
dbms = dlm;
guessingrows=max;
delimiter = "&dlm";
run;
/* Examine all numeric columns and INPUT them as CHAR if necessary */
proc contents data = csv_to_sas
out = c noprint;
run;
proc sql noprint;
select catx(' ','max(',name,') as', name,'format=best32.')
into :maxes
separated by ','
from c
where type = 1
;
select name, type
into :n1-, :t1-
from c
order by varnum
;
%let col_cnt = &sqlobs;
quit;
proc sql;
create table maxes as
select &maxes
from csv_to_sas
;
quit;
proc datasets lib = work nolist;
delete char;
quit;
data char;
length name $32.;
set maxes;
array nums _numeric_;
do over nums;
if nums > input('9,007,199,254,740,992', comma32.) then do;
name = vname(nums);
output;
end;
end;
run;
%let data_step = N;
%if %sysfunc(exist(char)) %then %do;
%if %attrn(char,nobs) > 0 %then %do;
%let data_step = Y;
%put Reimporting via data step: &dir_fn;
%end;
%end;
%if &data_step = Y %then %do;
proc sort data = c; by name; run;
proc sort data = char; by name; run;
data metadata;
merge c ( in = c )
char ( in = chars );
by name;
if chars then do;
informat = '$19.';
format = informat;
end; else do;
if informat > ' ' then do;
informat = cats(informat,put(informl,4.-l),'.',put(informd,4.-l));
format = informat;
end;
end;
run;
/* Write the datastep */
%let path = %sysfunc(pathname(work));
%put WORK DIR IS: &path;
proc sort data = metadata;
by varnum;
run;
data data_step;
length line $256.;
file "&path/data_step.txt";
line = 'data WORK.CSV_TO_SAS ;'; output; put line;
line = '%let _EFIERR_ = 0; /* set the ERROR detection macro variable */'; output; put line;
line = "infile '&dir_fn' delimiter = '&dlm' MISSOVER DSD lrecl=32767 firstobs=2;"; output; put line;
do until(eof);
set metadata end = eof;
if informat > ' ' then do;
line = catx(' ','informat',name, informat,';');
output;
put line;
end;
if format > ' ' then do;
line = catx(' ','format',name, format,';');
output;
put line;
end;
end;
line = 'input';
output;
put line;
%do z = 1 %to &col_cnt;
line = "&&n&z";
%if &&t&z = 2 %then %do;
line = trim(line) || " $";
%end;
output;
put line;
%end;
line = ';'; output; put line;
line = "if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */"; output; put line;
line = "if _ERROR_ then call symputx('_EFIERR_',1);"; output; put line;
line = 'run;'; output; put line;
stop;
run;
/* Run the data step import */
%include "&path/data_step.txt" /source2;
%end;
... View more