如何在ruby中使用奇怪的引用来阅读CSV?

时间:2017-09-14 00:28:49

标签: ruby csv

我有一些CSV文件,如:

col1,col "two",col3

因此我收到Illegal quoting错误并通过设置:quote_char => "\x00"

来解决此问题
["col1", "col\"two\"", "col3"]

但有一行像

col1,col2,"col,3"

稍后在该文件中

["col1", "col2", "\"col", "3\""]

然后我逐行读取文件并调用parse_csv包裹在块中。设置:quote_char => "\""rescue CSV::MalformedCSVError例外情况,对于特定行设置:quote_char => "\x00"retry

一切顺利,直到我们得到行

col1,col "two","col,3"

在这种情况下,rescue来自异常,设置为:quote_char => "\x00",结果为

["col1", "col\"two\"", "\"col", "3\""]

Apple Numbers可以完全正确地打开该文件。

parse_csv是否有任何设置可以在没有预处理字符串的情况下以某种方式处理此问题?

UPD 我显示文件中的CSV行和p打印的结果(数组)。我的字符串中没有实际的\"

2 个答案:

答案 0 :(得分:1)

CSV不是一个标准,而是更多的名称,每个人都认为他们正在使用它来正确描述他们古怪的格式,这是尽管他们是RFC standard for CSV,这是另一个没人注意的事情

因此,很多读取CSV的程序都非常宽容。 Ruby的核心CSV库非常好,但不如其他人适应性强。那是因为你有红宝石可以让你摆脱困境,在数字中你不会。

尝试将\"重写为""这是传统的CSV格式,如上面链接的规范中所定义:

CSV.parse(File.read.gsub(/\\"/, '""'))

答案 1 :(得分:1)

这是一个无效的csv文件。如果您有权访问源,您可以(要求)生成如下数据:

col1,"col ""two""","col,3"

如果没有,唯一的选择是自己解析数据:

pseudocode:

while(read_line) {

    bool InsideQuotes = false
    for each_char_in_line {

        if(char == doublequote)
            InsideQuotes = !InsideQuotes 

        if(char == ',' and !InsideQuotes)
            // separator found - process field
    }
}

这也会处理col1,"col ""two""","col,3"中的转义引号。

如果文件包含多行字段,则还需要完成更多工作。