Ruby CSV.parse очень требователен при кавычках - PullRequest
2 голосов
/ 01 апреля 2012

Я считаю, что синтаксический анализ CSV в Ruby 1.9.3 является чрезвычайно хрупким.Настолько, что мне интересно, что я делаю что-то не так

Если я сделаю следующее в 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

Есть ли какая-то опция разбора, которая мне не хватает, которая делает использование значений в кавычках настолько хрупким?

1 Ответ

3 голосов
/ 01 апреля 2012

Это правильное поведение. Это не хрупкость.

Ваша запятая после «четыре» заканчивает поле, а следующее поле начинается сразу с пробела.

Вы не можете корректно поставить кавычку в середине поля (без экранирования).

...