2016-12-16 24 views
2

我試圖使用readtable()將CSV文件讀入DataFrame。 CSV文件中存在一個不幸的問題,如果給定行的最後一列是空白的,而不是生成那麼多的逗號,它只是結束該行。例如,我可以有:Readtable()具有不同的列數 - Julia

Col1,Col2,Col3,Col4 
item1,item2,,item4 
item5 

請注意第三行中只有一個條目。理想情況下,我希望閱讀表用NA,NA和NA填寫Col2,Col3和Col4的值;但是,由於缺少逗號,因此缺少空字符串,readtable()只是將其視爲與列數不匹配的行。如果我使用上面的示例CSV在Julia中運行readtable(),則會出現錯誤「Saw 2 Row,2 columns,5 fields,* Line 1 6 columns」。如果我在item5之後添加3個逗號,那麼它可以工作。

有沒有辦法解決這個問題,還是我需要修復CSV文件?

回答

3

如果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" │ ""  │ "" │ ""  │ 
0

丹·蓋茨的答案是好的,但它的一切轉換爲字符串。

下面的解決方案,而不是「補」的差距,並寫入新文件(在存儲高效的方式),然後可以正常導入使用readtable():

function fillAll(iF,oF,d=",") 
    open(iF, "r") do i 
     open(oF, "w") do o # "w" for writing 
      headerRow = strip(readline(i)) 
      headers = split(headerRow,d) 
      nCols = length(headers) 
      write(o, headerRow*"\n") 
      for ln in eachline(i) 
       nFields = length(split(strip(ln),d)) 
       write(o, strip(ln)) 
       [write(o,d) for y in 1:nCols-nFields] # write delimiters to match headers 
       write(o,"\n") 
      end 
     end 
    end 
end 

fillAll("data.csv","data_out.csv",";") 
0

更妙的是:只要使用CSV.jl

julia> f = IOBuffer("Col1,Col2,Col3,Col4\nitem1,item2,,item4\nitem5"); # or the filename 

julia> CSV.read(f) 
2×4 DataFrames.DataFrame 
│ Row │ Col1 │ Col2 │ Col3 │ Col4 │ 
├─────┼─────────┼─────────┼───────┼─────────┤ 
│ 1 │ "item1" │ "item2" │ #NULL │ "item4" │ 
│ 2 │ "item5" │ #NULL │ #NULL │ #NULL │