2017-01-13 4 views
0

Ruby 2.4를 사용하고 있습니다. 어떻게하면 따옴표 문자가 포함 된 탭 구분선을 구문 분석합니까? 이 TEH 예를 들어 내 포인트를 설명했지만 대답이 TEH 문자열에서 모든 따옴표를 제거 "< 될 coudl 있지만, 나는 쉽게 입력 그래서. 오는 제어 할 수 없습니다 ...따옴표가 포함 된 탭 구분선을 어떻게 파싱합니까?

2.4.0 :003 > line = "11\tDave\tO\"malley" 
=> "11\tDave\tO\"malley" 
2.4.0 :004 > CSV.parse(line, col_sep: "\t") 
CSV::MalformedCSVError: Illegal quoting in line 1. 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1912:in `block (2 levels) in shift' 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1868:in `each' 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1868:in `block in shift' 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1828:in `loop' 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1828:in `shift' 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1770:in `each' 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1784:in `to_a' 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1784:in `read' 
    from /Users/davea/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/csv.rb:1324:in `parse' 
    from (irb):4 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands.rb:18:in `<top (required)>' 
    from bin/rails:4:in `require' 
    from bin/rails:4:in `<main>' 

지금 나에게 일어나고있는 일입니다 파싱하기 전에 "나는 가능한 한 데이터를 가깝게 보존하고 싶습니다.

답변

1

CSV 표준을 고수하려고하면 조작 된 문서입니다. Instad 당신은 무차별를 수도 및 데이터 자체에는 탭이 없다기도 :

"1\t2\t\"3a\t3b\"\t4" 

:이 같은 데이터를 처리 할 때

line.split(/\t/) 

csv로 파싱 라이브러리가 유용는 업데이트 : 조금 후이 작업을 수행 할 수있는 CSV 라이브러리 남용 할 준비가있어 경우 : 그래서 만약,

CSV.parse("11\tDave\tO\"malley", col_sep: "\t", quote_char: "\0") 

기본적으로 인용 감지 사망 다시 제대로 처리되는 다른 데이터가 있습니다. 제대로 작동하지 않을 수 있습니다.

+0

내가 원하는하지 않았다 인용 각 요소를 두 배로하는 것입니다 너무 내 질문에 잡초에 도착하지만 실제로는 구분 기호 쉼표 또는 탭 수있는 CSV.parse (줄, col_sep : 구분 기호) 일반 함수가 있습니다. 다른 구분 기호가 있습니까? – Dave

+0

CSV 라이브러리는 적어도 대략적으로 CSV "표준"에 부합하는 데이터 만 처리 할 수 ​​있습니다. 데이터가 하위 최적의 솔루션으로 남아 있지 않기 때문에 이 답변에 대한 대안을 추가했습니다. – tadman

0

이다 "맬리"11 \ tDave \는 \에 "유효하지 CSV 데이터. 이상하게도, 대답은 두 개의 큰 따옴표를 사용하고,

2.3.1 :001 > require 'csv' 
=> true 
2.3.1 :002 > line = "\"11\"\t\"Dave\"\t\"O\"\"malley\"" 
=> "\"11\"\t\"Dave\"\t\"O\"\"malley\"" 
2.3.1 :003 > puts line # for clarity 
"11" "Dave" "O""malley" 
=> nil 
2.3.1 :004 > CSV.parse(line, col_sep: "\t") 
=> [["11", "Dave", "O\"malley"]] 
+0

설명은 https://tools.ietf.org/html/rfc4180#page-3, 7 단락을 참조하십시오. – Glyoko