This is a non-trivial problem.
note.1: where I changed the length of a known variable with the attribute statement
and the var-name does not match the case of the master data set
then that var-name is changed.
Since is this is a demo of proof-of-concept
this may not matter.
note.2 be aware of the fragile nature of the cat* functions;
if they return a value larger than $200 then it will truncate your list
solution: add a length=nnnn after the catx function call
note.3 data structure may be only <1% of your code
but it is the first place I turn to when my algorithm fails.
Likewise here: I recommend adding the data structure of A
to the code that creates B; this is my recommended solution and solves all later appending.
DATA B;
if 0 then set A;
*...;
note.4 this solution assumes both data sets are different
and thus have to be copied in order to change the lengths.
hth
Ron Fehd list processing maven
*note case of name matters in output;
data class1;
attrib sex length = $2;
set sashelp.class;
data class2;
attrib name length = $10;
set sashelp.class;
%macro save_attrib(libname=work, memname=,out=);
PROC sql noprint;
create table &out as
select name, lowcase(name) as name_lc, type, length
from dictionary.columns
where libname eq "%upcase(&libname)"
and memname eq "%upcase(&memname)"
and memtype eq "DATA";
quit;
run;
%mend;
%save_attrib(memname=class1,out=contents1)
%save_attrib(memname=class2,out=contents2)
DATA attributes;
set contents1
contents2;
run;
PROC sort data = &syslast;
by name_lc length;
run;
DATA attributes;
retain max_length 0;
set &syslast;
by name_lc;
if first.name_lc then max_length = 0;
max_length = max(max_length,length);
if last.name_lc then output;
run;
PROC sql noprint;
select catx(' ',name,'length='
,case when type eq 'char' then '$'
else ' '
end
,length) into :list separated by ' '
from &syslast;
quit;
%put echo &=list;
%macro update_attrib(data=,base=largest);
DATA &DATA;
attrib &list;
set &data;
PROC append data = &data
base = &base;
run;
%mend;
%update_attrib(data=class1)
%update_attrib(data=class2)
proc print data = &syslast;
PROC sql; describe table &syslast;
quit;
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.