Re: Turning a Text Sequence into a Sequence Array

new topic     » goto parent     » topic index » view thread      » older message » newer message
DanM said...
Kaladan said...

Okay, thanks! I've always been wary of betas, but I'll give it a go! Thank you very much!

I have a version of split() that works as far back as Euphora 2.2, if you prefer to use an older version of Euphoria until 4.0 is out of beta.

-- (c) Copyright - See License.txt 
-- 
 
global function find_from(object delim, sequence st, integer start) 
	integer ret 
	ret = find(delim, st[start..length(st)]) 
	if ret then 
		ret = ret + start - 1 
	end if 
	return ret 
end function 
 
global function match_from(object delim, sequence st, integer start) 
	integer ret 
	ret = match(delim, st[start..length(st)]) 
	if ret then 
		ret = ret + start - 1 
	end if 
	return ret 
end function 
 
global function split_with_limits(object delim, sequence st, integer limit, integer no_empty) 
	sequence ret 
	integer start 
	integer pos 
	integer k 
 
	ret = {} 
 
	if length(st) = 0 then 
		return ret 
	end if 
 
 
	if sequence(delim) then 
		-- Handle the simple case of split("", "123"), opposite is join({"1","2","3"}, "") -- "123" 
		if equal(delim, "") then 
			for i = 1 to length(st) do 
				st[i] = {st[i]} 
				limit -= 1 
				if limit = 0 then 
					st = append(st[1 .. i],st[i+1 .. length(st)]) 
					exit 
				end if 
			end for 
 
			return st 
		end if 
 
		start = 1 
		while start <= length(st) do 
			pos = match_from(delim, st, start) 
 
			if pos = 0 then 
				exit 
			end if 
 
			ret = append(ret, st[start..pos-1]) 
			start = pos+length(delim) 
			limit -= 1 
			if limit = 0 then 
				exit 
			end if 
		end while 
	else 
		start = 1 
		while start <= length(st) do 
			pos = find_from(delim, st, start) 
 
			if pos = 0 then 
				exit 
			end if 
 
			ret = append(ret, st[start..pos-1]) 
			start = pos + 1 
			limit -= 1 
			if limit = 0 then 
				exit 
			end if 
		end while 
	end if 
 
	ret = append(ret, st[start..length(st)]) 
 
	k = length(ret) 
	if no_empty then 
		k = 0 
		for i = 1 to length(ret) do 
			if length(ret[i]) != 0 then 
				k += 1 
				if k != i then 
					ret[k] = ret[i] 
				end if 
			end if 
		end for 
	end if 
 
	if k < length(ret) then 
		return ret[1 .. k] 
	else 
		return ret 
	end if 
end function 
 
global function split(object delim, sequence st) 
	return split_with_limits(delim, st, 0, 0) 
end function 
 
object result 
result = split(" ", "John Middle Doe") 
for i = 1 to length(result) do 
	puts(1, "|"&result[i]&"|\n") 
end for 
new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu