Split String into Array

This Q&A forum allows users to post and respond to "How Do I Do ....." questions. Please do not use to report (suspected) errors - you must use your regional help desk for this. The information contained in this forum has not been validated by LANSA and, as such, LANSA cannot guarantee the accuracy of the information.
Post Reply
jyoung
Posts: 651
Joined: Thu Jan 21, 2016 6:43 am
Location: Oklahoma City, OK USA

Split String into Array

Post by jyoung » Wed Jun 14, 2017 2:35 am

Is there any way to split a string into an array based on a character?

For example, in most other languages you can do something like String[] myArrary = myString.Split("|").

Does something like this exist in LANSA?

Right now I am using an awful lot of OccurancesOf, PositionOf and Substring to parse a delimited string.

Something like

Code: Select all

define_com class(#PRIM_ACOL<#PRIM_ALPH>) name(#MyArray) reference(*DYNAMIC)
#MyArray <= #UserData.Split( "|" )
Would be great IMHO.

gstenstrom
Posts: 17
Joined: Thu Feb 16, 2017 8:35 am

Re: Split String into Array

Post by gstenstrom » Thu Jun 15, 2017 3:10 am

This comes from SplitString xDemoUtilities
I copied it to have our own which I use below

Code: Select all

* Utilities - Variety of commonly used methods
Define_Com Class(#OC_RP_DemoUtilities) Name(#Utilities)

Define Field(#w_char) Type(*CHAR) Length(1)
Define Field(#w_token) Reffld(#STD_TEXT)
Define Field(#wlstListCount) Reffld(#ListCount)
Def_List Name(#w_tokenlist) Fields(#w_token) Counter(#wlstListCount) Type(*WORKING) Entrys(*MAX)


* Iterate through the items in the string, using a ~ as the separator and including blank items.
#OC_Ref_EmailAddress := #ADDR10

Clr_List Named(#w_tokenlist)
For Each(#Word) In(#Utilities.SplitString( #addr10 "~" True ))
#w_token := #Word.AsNativeString
Add_Entry To_List(#w_tokenlist)
Endfor
If Cond(#wlstListCount *GT 0)
* use first token for email address
Get_Entry Number(1) From_List(#w_tokenlist) Ret_Status(#IO$STS)
#OC_Ref_EmailAddress := #w_token
Clr_List Named(#w_tokenlist)
Endif

Code: Select all

Mthroutine Name(SplitString)
Define_Map For(*Input) Class(#Prim_dc.UnicodeString) Name(#String)
Define_Map For(*Input) Class(#Prim_dc.UnicodeString) Name(#Separator) Mandatory(" ")
Define_Map For(*Input) Class(#Prim_boln) Name(#IncludeBlankItems) Mandatory(False)
Define_Map For(*Result) Class(#prim_lcol<#Prim_dc.UnicodeString>) Name(#Result) Pass(*by_reference)

Define_Com Class(#prim_nmbr) Name(#Break)

#Result <= *New #prim_lcol<#Prim_dc.UnicodeString>

If (#String <> "")

Begin_Loop

* Look for the first separator in the string
#Break := #String.PositionOf( #Separator )

Case (#Break)

When (= 0) /* No separator found, so must be a whole word remaining */

#Result.Insert( (*New #Prim_dc.unicodeString) )
#Result.Last := #String

Leave

When (= 1) /* Separator is next character, so must be zero length item */

If (#IncludeBlankItems)

#Result.Insert( (*New #Prim_dc.unicodeString) )

Endif

Otherwise /* Substring */

#Result.Insert( (*New #Prim_dc.unicodeString) )
#Result.Last := #String.Substring( 1 (#Break - 1) )

Endcase

* Remove the item from the string
#String := #String.DeleteSubstring( 1 #Break )

End_Loop

Endif

Endroutine

Post Reply