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.
>>
> ​
>

Reply via email to