2012-04-01 1 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에 따르면 큰 따옴표로 묶으면 필드 안에 쉼표를 사용할 수 있습니다. –