BookmarkSubscribeRSS Feed

Converting a vector of character elements to a character variable

Started ‎11-23-2022 by
Modified ‎11-23-2022 by
Views 561

@Rick_SAS wrote a SAS blog article posted July 27, 2015 (Convert a vector to a string) which described an algorithm to convert a vector of character strings to a single character variable. He needed a loop to perform the (sorry) recharacterization of the strings into a single string, and said that "[i]t is difficult to eliminate the DO loop in the module and truly vectorize this process."

 

I took his statement as a challenge and created a non-looping version of his MakeString module. As a test case, I used a modified line from Joyce Kilmer's poem, Trees.

 

Here is the SAS/IML program:

proc iml ;
   start MakeString( vv, delim=' ', interm_delim='#' ) ;
      /* purpose: convert vector of string elements vv into single string containing all elements of vv
       *
       * vv           ::= string vector containing individual strings to be contained in resulting single string
       * delim        ::= character that separates individual strings in resulting single string
       * interm_delim ::= intermediate delimiter used in internal processing
       *
       * note: intermediate delimiter interm_delim must not be a character in any of the elements of vv
       */
      
      v = colvec( vv )                                ;
      v1 = v || repeat( interm_delim, nrow( v ) , 1 ) ;
      v2 = rowcatc( rowvec( v1 ))                     ;
      v3 = tranwrd( v2, interm_delim, delim )         ;
      
      return v3 ;
   finish ;

/* create a vector of strings */
a={ 'I' 'think' 'that' 'I' 'shall' 'never' 'see' 'an' 'algorithm' 'as' 'lovely' 'as' 'a' 'tree' } ;

/* convert vector of string elements into string variable */
b = MakeString( a ) ;

print a b ;

quit ;

The test case and result are reproduced below.

 

/* create a vector of strings */
a={ 'I' 'think' 'that' 'I' 'shall' 'never' 'see' 'an' 'algorithm' 'as' 'lovely' 'as' 'a' 'tree' } ;

/* convert vector of string elements into string variable */
b = MakeString( a ) ;

print a b ;

 

b
  COL1
ROW1

I think that I shall never see an algorithm as lovely as a tree

Comments

I think your function delets blanks in the matrix. Try this one

a = {"I think" "that I shall" "never see" "an algorithm"};
b = MakeString(a, "/") ;
print b;

 

Using your example, MakeString returns:

b
Ithink/thatIshall/neversee/analgorithm/

which is the result of ROWCATC() compressing all of the blanks in its argument and subsequent code separating strings. I designed MakeString to operate on simple character strings contained in a vector, not compound strings consisting of more than one blank-delimited character string such as represented in your example.

 

If your application requires that a vector of simple or compound strings be converted into a string variable, here is a possible solution:

a = {"I$think" "that$I$shall" "never$see" "an$algorithm"};
b = MakeString(a) ;
c = tranwrd( b, '$', ' ' ) ;
print b c ;
/******************************************************************************/
b
I$think that$I$shall never$see an$algorithm
c
I think that I shall never see an algorithm

HTH,

Ross

Version history
Last update:
‎11-23-2022 04:20 PM
Updated by:

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Free course: Data Literacy Essentials

Data Literacy is for all, even absolute beginners. Jump on board with this free e-learning  and boost your career prospects.

Get Started

Article Tags