在Julia中使用带有DataFrames.jl的writetable()时输出不带引号的字符串?

时间:2016-08-03 07:18:11

标签: dataframe julia

使用writetable将DataFrame中的字符串写入文件的默认设置是它们被引号括起来:

using DataFrames
df = DataFrame(letters=["A","B","C"],numbers=[1,2,3])
writetable("df_file", df, separator='\t')

生成以下文件:

"letters"   "numbers"
"A" 1
"B" 2
"C" 3

可以选择更改引号字符:

writetable("df_file", df, separator='\t', quotemark='.')

.letters.   .numbers.
.A. 1
.B. 2
.C. 3

但如果没有指定字符,则无效

writetable("df_file", df, separator='\t', quotemark='')
ERROR: syntax: invalid character literal

我的问题是:如何编写没有任何引号字符的字符串?这将是我需要的输出:

letters numbers
A   1
B   2
C   3

我目前正在使用Julia版本0.4.1,DataFrames软件包版本0.6.10。

2 个答案:

答案 0 :(得分:4)

根据此GitHub讨论,DataFrames包的创建者不信任具有此类权限的用户可以控制其输出。

我的个人建议是转换为Array,然后使用朱莉娅的writedlm() 信任用户知道他们想要写入文件的内容:

writedlm(FileName, convert(Array,df), '\t')

要包含标题,您可以使用以下内容:

open(FileName, "w") do f
    writedlm(f, names(df)', '\t')
    writedlm(f, convert(Array,df), '\t')
end

请参阅此相关问题,并提供类似的答案:Is there a way to use strings as separators in writetable() - Julia

答案 1 :(得分:3)

我很想写一个像这样的快速:

julia> n, p = size(df)
(3,2)

julia> open("/tmp/df_file.txt", "w") do f
            for i in 1:n
               for j in 1:p
                  write(f, string(df[i, j]))
                  write(f, "\t")
               end
               write(f, "\n")
             end
        end

或者如果我有更多的时间,我可能会开始写这样的东西(writetable函数来源的修改版本):

julia> function myprinttable(io::IO,
                           df::AbstractDataFrame;
                           header::Bool = true,
                           separator::Char = ',',
                           quotemark::AbstractString = "\"",
                           nastring::AbstractString = "NA")
           n, p = size(df)
           etypes = eltypes(df)
           if header
               cnames = DataFrames._names(df)
               for j in 1:p
                   print(io, quotemark)
                   print(io, cnames[j])
                   print(io, quotemark)
                   if j < p
                       print(io, separator)
                   else
                       print(io, '\n')
                   end
               end
           end
           quotestr = quotemark
           for i in 1:n
               for j in 1:p
                   if ! (isna(df[j],i))
                       if ! (etypes[j] <: Real)
                           print(io, quotemark)
                           DataFrames.escapedprint(io, df[i, j], quotestr)
                           print(io, quotemark)
                       else
                           print(io, df[i, j])
                       end
                   else
                       print(io, nastring)
                   end
                   if j < p
                       print(io, separator)
                   else
                       print(io, '\n')
                   end
               end
           end
           return
       end
julia> open("/tmp/df_file.txt", "w") do f
          myprinttable(f, df, header=true, separator='\t', quotemark="")
       end

(大部分未经测试。)

只是将quotemark从Char更改为String。 (我仍然习惯于Julia在某些地方使用Char而不是单字符字符串。