Historical SplitToTypes, Revision 3
Split To Types
- by AntHill
I could not find a similar function to parse geographic coordinates from a string in a generic way. Perhaps someone might find this useful or may know of a better way of doing it. The function uses recursion.
include std/pretty.e
include std/convert.e
include std/sequence.e
function split_to_type( sequence s, sequence delims, sequence types )
-- delims: split by word etc ... e.g. {" ","|"}
-- types: i (integer), n (numeric), "" means not to convert ... e.g. {"", "i", "n"}, s is string
-- delims and types should be of equal length to work as expected
if length(delims) > 0 then
s = split(s, delims[1])
for i = 1 to length(s) do
if equal(types[1], "") = 1 then
s[i] = split_to_type(s[i], remove(delims, 1), remove(types, 1))
elsif equal(types[1], "i") = 1 then
s[i] = to_integer(s[i])
elsif equal(types[1], "n") = 1 then
s[i] = to_number(s[i])
end if
end for
end if
return s
end function
sequence s, a
s = "34.5,124.1 333.9,82.4|3223442.78,12 33.9,8.4 342.78,12.4 353.9,48.4"
puts (1,"input string: " & s & "\n")
a = split_to_type(s,{"|"," ",","},{"","","n"})
pretty_print(1,a)
output looks like:
input string: 34.5,124.1 333.9,82.4|3223442.78,12 33.9,8.4 342.78,12.4 353.9,48.4
{
{
{34.5,124.1},
{333.9,82.4}
},
{
{3223442.78,12},
{33.9,8.4},
{342.78,12.4},
{353.9,48.4}
}
}
- by bill
A couple of remarks.
1. It would seem better of use a single list of parameters like:
enum INT, NUM, STR par = {"|"," ",",",NUM}
so that the typing of fields is done last - rather than passing a delimiter and a type together.
2. A question arises about quoted strings. I guess they are not handled because they will not occur in your data.
In the code that follows {} is handled explicitly and apply is used rather than recursion. I think it is a little clearer than the for-loop and recursion.
include std/sequence.e as seq include std/convert.e enum INT, NUM, STR function split(sequence S, integer d) -- provide default parameters return seq:split(S,d,0,0) end function constant _split = routine_id("split") constant _Split = routine_id("Split") function Split(sequence S, sequence DT) if length(S) = 0 then return S elsif length(DT) = 1 then switch DT[1] do case INT then return to_integer(S) case NUM then return to_number(S) case STR then return S end switch elsif sequence(S[1]) then return apply(apply(S, _split, DT[1]), _Split, DT[2..$]) else return apply(split(S, DT[1]), _Split, DT[2..$]) end if end function ? Split("34.5,124.1 333.9,82.4|3223442.78,12 33.9,8.4 342.78,12.4 353.9,48.4","| ," & NUM)
bj
- diff to current revision, view current revision history, backlinks
- Last modified Oct 05, 2011 by DerekParnell

