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