1. split to types
- Posted by Anthill Sep 28, 2011
- 1490 views
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. Also, if this is not the correct place to post examples then please let me know.
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} } }
2. Re: split to types
- Posted by bill Oct 01, 2011
- 1293 views
A couple of remarks.
enum INT, NUM, STR par = {"|"," ",",",NUM}
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)
3. Re: split to types
- Posted by Anthill Oct 05, 2011
- 1131 views
Very nice Bill, its a great improvement. Thanks!
It would be nice to have an open function/example (open libraries) place on OpenEuphoria so that programmers can learn how to use the language and expedite the expansion of the language using generic functions outside of the official documentation.