2017-10-15 25 views
2

當我在含有readtable()當字符串與

「號碼」, 「文本」

1 「row1text \」

2 csv文件讀取結束時,」 row2text」

與命令

using DataFrames 

readtable(filename.csv) 

我只有一行數據幀。顯然,第一行文本末尾的反斜槓是個問題。這是預期的行爲?有避免這個問題的另一種方法嗎?

作爲一個邊注:以下正常工作(即我得到兩行),但顯然是不切實際的,在大文件

df = csv""" 

    "number","text" 

    1,"row1text\" 

    2,"row2text" 

    """ 
+0

第二個是我意外的。差異是由宏csv_str中使用的IOBuffer(轉義)造成的。雖然你喜歡這種行爲,但它可能是bug。 – Liso

回答

1

由於反斜槓是默認轉義字符閱讀,它避開報價標記和攪亂一切。一個解決辦法是使用CSV.jl包,並指定一個不同的轉義字符:

julia> using CSV 

julia> CSV.read("filename.csv", escapechar = '~') 
2×2 DataFrames.DataFrame 
│ Row │ number │ text  │ 
├─────┼────────┼─────────────┤ 
│ 1 │ 1  │ "row1text\" │ 
│ 2 │ 2  │ "row2text" │ 

但你必須確保~字符不是逃避別的東西。這樣做可能有更好的方法,但這是解決問題的一種手段。

另一種方法是逐行處理數據。這是一個過度複雜的例子:

julia> open("filename.csv", "r") do f 
      for (i, line) in enumerate(eachline(f)) 
       if i == 1 
       colnames = map(Symbol, split(line, ',')) 

       global df = DataFrame(String, 0, length(colnames)) 

       rename!(df, 
         Dict([(old_name, new_name) for (old_name, new_name) in zip(names(df), colnames)])) 

       else 
        new_row = map(String, split(replace(line, "\\\"", "\""), ',')) 
        # replace quotes around vales 
        new_row = map(x -> replace(x, "\"", ""), new_row) 
        push!(df, new_row) 
       end 
      end 
     end 

julia> df 
2×2 DataFrames.DataFrame 
│ Row │ "number" │ "text"  │ 
├─────┼──────────┼────────────┤ 
│ 1 │ "1"  │ "row1text" │ 
│ 2 │ "2"  │ "row2text" │ 
+0

第二個也是黑客(恕我直言更糟糕),例如:'println(「\」反斜槓問題\\\\「」)或'println(「\」新行\ n問題\「」)' – Liso

+0

它絕對是一個黑客,並不是一個很好的。只是把它扔到那裏,所以也許有人可以改進它或促進新的解決方案。 – niczky12