A little but elegant change:SARG wrote: ↑Apr 07, 2022 9:29 Split function
delimiter : by default one space
limit by default all the substrings (could be 1, 2,..)
Code: Select all
sub split(res() as string,strg as string,delim as string=" ",limit as integer=-1) dim as integer resmax=0 dim as integer strglen=len(strg),posinstrg=1,delimlen=len(delim),delimfound if strglen=0 then ''len = zero --> empty array return End If if len(delimlen)=0 or instr(posinstrg,strg,delim)=0 then ''One element the original string redim res(0) res(0)=strg return End If if limit=-1 then limit=9999999999 End If while posinstrg<strglen and resmax<limit delimfound=instr(posinstrg,strg,delim) redim preserve res(resmax) if delimfound then res(resmax)=mid(strg,posinstrg,delimfound-posinstrg) posinstrg+=delimlen+len(res(resmax)) else res(resmax)=mid(strg,posinstrg) posinstrg+=len(res(resmax)) end if resmax+=1 Wend return End sub redim as string rstrg() split(rstrg(),"abc - def - fgh"," - ") for i as integer =lbound(rstrg) to ubound(rstrg) print i,rstrg(i) Next print "end" sleep
Code: Select all
#include once "crt/limits.bi"
function split(res() as string,strg as string,delim as string=" ",limit as integer=-1)as integer /' return value is total number of elements'/
dim as integer resmax=0
dim as integer strglen=len(strg),posinstrg=1,delimlen=len(delim),delimfound
if strglen=0 then ''len = zero --> empty array
return 0
End If
if len(delimlen)=0 or instr(posinstrg,strg,delim)=0 then ''One element the original string
redim res(0)
res(0)=strg
return 1
End If
if limit=-1 then
limit=INT_MAX
End If
while posinstrg<strglen and resmax<limit
delimfound=instr(posinstrg,strg,delim)
redim preserve res(resmax)
if delimfound then
res(resmax)=mid(strg,posinstrg,delimfound-posinstrg)
posinstrg+=delimlen+len(res(resmax))
else
res(resmax)=mid(strg,posinstrg)
posinstrg+=len(res(resmax))
end if
resmax+=1
Wend
return resmax
End FUNCTION