2012-04-01 7 views
2

Ruby 1.9.3でCSV解析が非常に脆弱であることがわかりました。そんなに私が何か間違ったことをやっている場合、私は疑問に思っているようRuby CSV.parse引用符で遭遇したときに非常にピックアップ

私は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>' 

を」 4,5 "という値になります。私がスペースを取り除くと、それは機能します。

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

可能な複製:http://stackoverflow.com/questions/1807942/overcoming-a-basic-problem-with-csv-parsing-using-the-fastercsv-gem – WarHog

+0

その回答を購入します。ありがとう@WarHog! –

答えて

3

これは正しい動作です。壊れやすいわけではない。

"4"の後のコンマはフィールドを終了し、次のフィールドはスペースですぐに開始されます。

引用符をフィールドの中央に置くことはできません(エスケープせずに)。

+0

RFC http://tools.ietf.org/html/rfc4180#page-2によれば、二重引用符で囲むと、フィールドの中にコンマを置くことができます。 –

関連する問題