readtable()当一个字符串以\结尾时

时间:2017-10-15 10:37:30

标签: csv julia

当我读入包含

的csv文件时
  

“号码”, “文本”

     

1, “row1text \”

     

2, “row2text”

使用命令

using DataFrames

readtable(filename.csv)

我得到的数据帧只有一行。显然,第一行中文本末尾的反斜杠是个问题。这是预期的行为吗?有没有其他方法可以避免这个问题?

作为旁注:以下工作正常(即我得到两行),但在阅读大文件显然是不切实际的

    df = csv"""

    "number","text"

    1,"row1text\"

    2,"row2text"

    """

1 个答案:

答案 0 :(得分: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" │