使用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。
答案 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而不是单字符字符串。