That is truly beautiful! Thank you Tomas
On Monday, November 9, 2015 at 5:01:10 PM UTC+8, Tomas Lycken wrote:
>
> I’d try to use the built-in tools for iterating and transforming stuff to
> make the code a little terser and easier to read:
>
> function df2json(df)
> io = IOBuffer()
> write(io, "[\n")
> write(io, join(map(row -> "{\"A\": $(row[:A]), \"B\": \"$(row[:B])\"}",
> eachrow(d)), ",\n"))
> write(io, "\n]\n")
> json = takebuf_string(io)
> close(io)
> json
> end
>
> The keys here is to use the map and eachrow functions to get rid of the
> for loops, and to build each item with string interpolation, which makes it
> easier to see what the result will be.
> Note that I end the entire message with a newline; I think this is good
> practice in any string buffer protocol.
>
> Next, I’d split the handling of the IO buffer away from the rest:
>
> function df2json(df)
> io = IOBuffer()
> df2json(io, df)
> json = takebuf_string(io)
> close(io)
> json
> end
>
> function df2json(io::IO, df)
> write(io, "[\n")
> write(io, join(map(row -> "{\"A\": $(row[:A]), \"B\": \"$(row[:B])\"}",
> eachrow(d)), ",\n"))
> write(io, "\n]\n")
> end
>
> I’d also make pretty-printing optional, to make it possible to write the
> JSON as compact as possible too:
>
> function df2json(df; pretty_print::Bool=false)
> io = IOBuffer()
> df2json(io, df; pretty_print=pretty_print)
> json = takebuf_string(io)
> close(io)
> json
> end
>
> function df2json(io::IO, df; pretty_print::Bool=false)
> write(io, "[")
> pretty_print && write(io, "\n")
> separator = "," * (pretty_print ? "\n\t" : "")
> space = pretty_print ? " " : ""
> write(io, join(map(row ->
> "{\"A\":$space$(row[:A]),$space\"B\":$space\"$(row[:B])\"}", eachrow(d)),
> separator))
> pretty_print && write(io, "\n")
> write(io, "]")
> write(io, "\n")
> end
>
> Now, this allows you to print the message either for human reading:
>
> julia> d = DataFrame(A=1:10, B=map(x -> x > 0.5 ? "F" : "M", rand(10)))
> 10x2 DataFrames.DataFrame
> | Row | A | B |
> |-----|----|-----|
> | 1 | 1 | "M" |
> | 2 | 2 | "M" |
> | 3 | 3 | "M" |
> | 4 | 4 | "M" |
> | 5 | 5 | "F" |
> | 6 | 6 | "F" |
> | 7 | 7 | "F" |
> | 8 | 8 | "M" |
> | 9 | 9 | "F" |
> | 10 | 10 | "F" |
>
> julia> println(df2json(d; pretty_print=true));
> [
> {"A": 1, "B": "M"},
> {"A": 2, "B": "M"},
> {"A": 3, "B": "M"},
> {"A": 4, "B": "M"},
> {"A": 5, "B": "F"},
> {"A": 6, "B": "F"},
> {"A": 7, "B": "F"},
> {"A": 8, "B": "M"},
> {"A": 9, "B": "F"},
> {"A": 10, "B": "F"}
> ]
>
> or for minimizing network overhead:
>
> julia> println(df2json(d))
> [{"A":1,"B":"M"},{"A":2,"B":"M"},{"A":3,"B":"M"},{"A":4,"B":"M"},{"A":5,"B":"F"},{"A":6,"B":"F"},{"A":7,"B":"F"},{"A":8,
> "B":"M"},{"A":9,"B":"F"},{"A":10,"B":"F"}]
>
> // T
>
> On Monday, November 9, 2015 at 6:12:31 AM UTC+1, Eric Forgy wrote:
>
> This is embarrassing since I'm just learning, but in the interest of
>> getting feedback and improving my Julia coding skills, here is what I did:
>>
>> function df2json(df::DataFrame)
>>
>> nrow,ncol = size(df)
>>
>> io = IOBuffer();
>> write(io,"[\n")
>> for irow = 1:nrow
>> irow == nrow ? eor = "" : eor = ","
>> write(io,"{")
>> for icol = 1:ncol
>> icol == ncol ? eoe = "" : eoe = ","
>> sym = names(df)[icol]
>> name = string(sym)
>> if isa(value,Number)
>> write(io,"\""*name*"\":"*string(df[irow,sym])*eoe)
>> else
>> write(io,"\""*name*"\":\""*df[irow,sym]*"\""*eoe)
>> end
>> end
>> write(io,"}"*eor*"\n")
>> end
>> write(io,"]\n")
>>
>> json = takebuf_string(io)
>> close(io)
>> json
>> end
>>
>>
>> Any thoughts/suggestions? Thank you.
>>
>
>