BookmarkSubscribeRSS Feed
thanikondharish
Calcite | Level 5

data name ;
input (v1-v5) ($) ;
cards ;

john peter max jann kiyaa
;

how to concatenate all variables of first letter like below

 

jpmjk

9 REPLIES 9
muratatik
Obsidian | Level 7
data name ;
input (v1-v5) ($) ;
array _v(5) $ v1-v5;
length want $8.;
do i= 1 to 5;
want=catt(want,substr(_v(i),1,1));
end;
drop i;
cards ;
john peter max jann kiyaa
;
run;
ChrisNZ
Tourmaline | Level 20

This works too.

 

data name ;
  input (V1-V5) ($) ;
  array _V(5) $1 V1-V5;   
  WANT=_V[1]||_V[2]||_V[3]||_V[4]||_V[5];
cards ;
john peter max jann kiyaa
run;

@mkeintz Calling on your PDV expertise. Do you understand why 

WANT=cats(_V[1],_V[2],_V[3],_V[4],_V[5]);

or

WANT=cats(of _V[*]);

don't work?

 

 

muratatik
Obsidian | Level 7

Hi @ChrisNZ;

 

I tried your solution but i didn't get the result.

 

Your Code Result: jomjk

 

It looks like _V[2] is John's second letter 'o'.

 

 

ChrisNZ
Tourmaline | Level 20

Wow this is crazy. Add 

putlog _V[1]= _V[2]= _V[3]= _V[4]= _V[5]=;

and you get 

V1=j V2=p V3=m V4=j V5=k

 

Even worse, add 

WANT=_V[1]||_V[2]||_V[2]||_V[3]||_V[4]||_V[5];

and you get 

WANT=jopmjk

 

Do you have the same behaviour?

muratatik
Obsidian | Level 7

Yes exactly the same result 🙂

 

But I didnt get it.

 

I looked some documents but couldn't find anything.

 

 

 

ChrisNZ
Tourmaline | Level 20

This looks like a defect. Or at least something I don't understand. I'll contact tech support.

ChrisNZ
Tourmaline | Level 20

Update: R&D are still investigating, but I dug a bit depper.

 

I was puzzled as to why function cats() should get a different value (the full string)? What’s special about it?

That quirkiness got me thinking. If some functions get a special treatment and can ignore variable length (and why should they?),

which other functions do this? Is there at least consistency about functions?

The answer is no. I tested a few functions and the behaviour varies (as seen in the suffix of the names).

    

  A_ALL=put      (_V[2],$upcase20.  );

  B_ONE=putc     (_V[2],'$upcase20.');

  C_ALL=count    (_V[2],'e'         );

  D_ALL=countc   (_V[2],'e'         );

  E_ONE=left     (_V[2]             );

  F_ALL=length   (_V[2]             );

  G_ALL=lengthn  (_V[2]             );

  H_ALL=find     (_V[2],'e'         );

  I_ALL=index    (_V[2],'e'         );

  J_ONE=lowcase  (_V[2]             );

  K_ONE=propcase (_V[2]             );

  L_ONE=upcase   (_V[2]             );

  M_ALL=reverse  (_V[2]             );

  N_ALL=right    (_V[2]             );

  O_ONE=trim     (_V[2]             );

  P_ONE=scan     (_V[2],1           );

  Q_ONE=strip    (_V[2]             );

  R_ALL=tranwrd  (_V[2],'e','E'     );

  S_ONE=translate(_V[2],'x','p'     );

  T_ALL=quote    (_V[2]             );

  U_ONE=compress (_V[2]             );

  V_ONE=compbl   (_V[2]             );

  W_ALL=prxmatch ('/e/',_V[2]       );

  X_ALL=prxchange('s/p/x/',1,_V[2]  );

  Y_ALL_THEN_ONE=substr(_V[2],3     );

So put() and putn() don’t behave the same. Left() and right() don’t either, like tranwrd() and translate().

Substr() does a bit of both (reads the full string but returns a one-character length result).

 

To be continued...

 

ChrisNZ
Tourmaline | Level 20

Final update.

 

After weeks of tech support talking to R&D, the conclusion is... drum roll... "Don't do this".  🙂

No explanation, simply: 

The ARRAY definition attempts to 'trick' or change the length of the variables to a length of 1.  This is not a recommended practice.  8><.   The recommended method would be to use SUBSTR function.

Or even the FIRST function I might add.

 

There we go. Case closed. 🙂

singhsahab
Lapis Lazuli | Level 10
data want;
length newvar $5.;
input (v1-v5) ($) ;
call catt(newvar,substr(v1,1,1),substr(v2,1,1),substr(v3,1,1),substr(v4,1,1),substr(v5,1,1));
cards ;
john peter max jann kiyaa
;
run;

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

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
  • 9 replies
  • 2816 views
  • 2 likes
  • 4 in conversation