2011-11-10 1 views
21

ruby​​-1.9.2でCSVファイルをインポートしようとすると信じられないほどの時間がありました。CSV引用エラーをインポートするとナッツが動く

私が解析しようとしているファイルがあります。col_sep

csv.txt(:列

  • 内の列内の

    • コンマ
    • 引用符のように '@' を使用しています代表入力、実数101kライン):

      㔾@㔾@jié@"seal" radical in Chinese characters, (Kangxi radical 26) 
      

      マイコード:

      require 'csv' 
      
      CSV.foreach("/Users/adam/Desktop/csvtest.txt", {:col_sep => "@"}) do |row| 
          puts row.to_s 
      end 
      

      マイ所望の出力:

      ["㔾", "㔾", "jié", "\"seal\" radical in Chinese characters, (Kangxi radical 26)"] 
      

      私は、出力のために何を得る:

      CSV::MalformedCSVError: Unclosed quoted field on line 1. 
      from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1910:in `block in shift' 
      from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1825:in `loop' 
      from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1825:in `shift' 
      from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1767:in `each' 
      from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1202:in `block in foreach' 
      from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1340:in `open' 
      from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1201:in `foreach' 
      from (irb):31 
      from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>' 
      

      それが閉じていない引用されfeildsがあると言うが、私はそれを見ることができます引用符を開閉します。

      引用符をエスケープすると何も行われません。私は同じエラー([email protected]""seal"" r...)を取得します。 一重引用符に変更すると機能します([email protected]'seal' r...)。 問題は二重引用符で囲む必要があることです。

      アイデア?

  • 答えて

    56

    私は問題がCSVが単一引用符の列として"seal"を解釈しようとしていると思います。しかし、それは@"seal"@のようには見えないので、引用符が列を囲むことになっているので、パーサーは混乱します。列が引用されていないことをCSVに伝えるオプションはありませんが、決して発生しないようなものに:quote_charを設定することで、それを回避することができます。あなたはUTF-8を使用している場合、あなたは安全に「が発生することはありません引用符文字」としてゼロバイトを使用することができます。

    CSV.foreach(filename, :col_sep => "@", :quote_char => "\x00") do |row| 
        #... 
    end 
    

    これは、限り、あなたの列のどれもが引用されていないとして動作するはずです。

    +2

    +1 CSV仕様。 HTMLと同様に、完全に濫用され、無視されます。両方のために、パーサーにデータを渡す前にデータを修正することが必要な時があります。私はそれもこの問題の解決策だと思いますが、私はあなたが 'quote_char =>" \ x00 "'でパーサーをだますのが好きです。良くやった。 –

    +2

    私は、実際にヌル文字を持つ 'bcp' MSSQLダンプからUTF-16を取得しています。ちょうど楽しみのために私は代替として雪だるまキャラクター(☃)を選んだ。 :) –

    +0

    この "" \ x00 "トリックは美しく動作します:-) – Avishai

    関連する問題