我正在尝试使用 readtable() 将 CSV 文件读入 DataFrame。 CSV 文件存在一个不幸的问题,如果给定行的最后 x 列为空白,它不会生成该数量的逗号,而只是结束该行。例如,我可以:
Col1,Col2,Col3,Col4
item1,item2,,item4
item5
请注意第三行中只有一个条目。理想情况下,我希望 readtable 用 NA、NA 和 NA 填充 Col2、Col3 和 Col4 的值;然而,由于缺少逗号并因此缺少空字符串,readtable() 只是将其视为与列数不匹配的行。如果我使用上面的示例 CSV 在 Julia 中运行 readtable(),我会收到错误消息“看到 2 行、2 列和 5 个字段,* 第 1 行有 6 列”。如果我在 item5 后添加 3 个逗号,则它有效。
有什么办法解决这个问题,还是我必须修复 CSV 文件?
最佳答案
如果 CSV 解析不需要太多的引用逻辑,很容易编写一个专用的解析器来处理缺少列的情况。像这样:
function bespokeread(s)
headers = split(strip(readline(s)),',')
ncols = length(headers)
data = [String[] for i=1:ncols]
while !eof(s)
newline = split(strip(readline(s)),',')
length(newline)<ncols && append!(newline,["" for i=1:ncols-length(newline)])
for i=1:ncols
push!(data[i],newline[i])
end
end
return DataFrame(;OrderedDict(Symbol(headers[i])=>data[i] for i=1:ncols)...)
end
然后是文件:
Col1,Col2,Col3,Col4
item1,item2,,item4
item5
会给出:
julia> df = bespokeread(f)
2×4 DataFrames.DataFrame
│ Row │ Col1 │ Col2 │ Col3 │ Col4 │
├─────┼─────────┼─────────┼──────┼─────────┤
│ 1 │ "item1" │ "item2" │ "" │ "item4" │
│ 2 │ "item5" │ "" │ "" │ "" │
关于csv - 具有不同列数的 Readtable() - Julia,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41175613/