【问题标题】:Ruby CSV.parse very picky when encountering quotesRuby CSV.parse 遇到引号时非常挑剔
【发布时间】:2012-04-15 11:43:02
【问题描述】:

我发现 Ruby 1.9.3 中的 CSV 解析非常脆弱。以至于我想知道我是否做错了什么

如果我在 irb 中执行以下操作,我会收到错误:

1.9.3-p125 :011 > require 'csv'
 => true
1.9.3-p125 :012 > a = 'one,two,three, "four, five",six'
 => "one,two,three, \"four, five\",six" 
1.9.3-p125 :013 > arr = CSV.parse(a)
CSV::MalformedCSVError: Illegal quoting in line 1.
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift'
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1887:in `each'
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1887:in `block in shift'
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1849:in `loop'
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1849:in `shift'
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1791:in `each'
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1805:in `to_a'
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1805:in `read'
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/csv.rb:1379:in `parse'
    from (irb):13
    from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'

我发现问题在于“四、五”值之前的多余空格。如果我删除空间,那么它可以工作。

1.9.3-p125 :010 > a = 'one,two,three,"four, five",six'
 => "one,two,three,\"four, five\",six" 
1.9.3-p125 :011 > arr = CSV.parse(a)
 => [["one", "two", "three", "four, five", "six"]]

其他值前面的空格不会导致问题。以下解析就好了

one, two, three,"four, five", six

是否有一些我缺少的解析选项使得使用引用值变得如此脆弱?

【问题讨论】:

标签: ruby csv fastercsv


【解决方案1】:

这是正确的行为。它并不脆弱。

“四”之后的逗号是该字段的结尾,下一个字段立即以空格开头。

您不能有效地将引号放在字段中间(不转义)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多