BookmarkSubscribeRSS Feed
Ron_MacroMaven
Lapis Lazuli | Level 10

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;

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 15 replies
  • 4208 views
  • 0 likes
  • 7 in conversation