2017-08-19 15 views
0

RubyでCSVファイルを解析していますが、区切り文字がコンマであるという問題があります。データにコンマが含まれています。RubyでCSVファイルのコンマを解析する方法

カンマを含むデータの部分では、データは ""で囲まれていますが、CSVが見積もりに含まれるカンマを無視する方法がわかりません。

例CSVデータ(file.csvになり)

NCB 14591 BLK 13 LOT W IRR," 84.07 FT OF 25, ALL OF 26,",TWENTY-THREE SAC HOLDING COR 

コード例:

require 'csv' 
CSV.foreach("File.csv", encoding:'iso-8859-1:utf-8', :quote_char => "\x00").each do |x| 
    puts x[1] 
end 

電流出力:25 OF 84.07 FT:25

予想される出力の「84.07 FT 、ALL OF 26、

サンプルファイルとコードを表示するには、要点にリンクしてください。 https://gist.github.com/markscoin/0d6c2d346d70fd627203317c5fe3097c

+0

':quote_char'をデフォルトの' '"''にする代わりに、 '' quote_char'を '' \ x00 "'に変更する理由はありますか?それはあなたがそのquote_charを取り出すと機能します。 CSVライブラリに引用符を無視して、引用符として '' \ x00 "'を探すように指示します –

+0

私はquote_charを "\ x00"として持っていました。約1Mの記録 –

+0

私はCSVを整理して違法引用を取り除き、Marko Tunjicの答えを実行しなければならなかった –

答えて

0

ラインがある場合、不正な引用にエラーがあるが引用符は含まれていますが、列全体をラップしないので、例えば、次のようなCSVがある場合:

NCB 14591 BLK 13 LOT W IRR," 84.07 FT OF 25, ALL OF 26,",TWENTY-THREE SAC HOLDING COR 
NCB 14592 BLK 14 LOT W IRR,84.07 FT OF "25",TWENTY-FOUR SAC HOLDING COR 

あなたは個別にそれぞれの行を解析し、のみ引用悪いを使用するラインの引用符文字を変更することができます:

require 'csv' 

def parse_file(file_name) 
    File.foreach(file_name) do |line| 
    parse_line(line) do |x| 
     puts x.inspect 
    end 
    end 
end 

def parse_line(line) 
    options = { encoding:'iso-8859-1:utf-8' } 
    begin 
    yield CSV.parse_line(line, options) 
    rescue CSV::MalformedCSVError 
    # this line is misusing quotes, change the quote character and try again 
    options.merge! quote_char: "\x00" 

    retry 
    end 
end 

parse_file('./File.csv') 

、これはあなたに与えランニング:

["NCB 14591 BLK 13 LOT W IRR", " 84.07 FT OF 25, ALL OF 26,", "TWENTY-THREE SAC HOLDING COR"] 
["NCB 14592 BLK 14 LOT W IRR", "84.07 FT OF \"25\"", "TWENTY-FOUR SAC HOLDING COR"] 

しかし、あなたの場合を1つの行に悪い引用と良い引用が混在すると、これは再び崩壊します。理想的には、有効になるようにCSVをクリーンアップしたいだけです。

1

force_quotesオプションを指定して試してみてください。

require 'csv' 
CSV.foreach("data.csv", encoding:'iso-8859-1:utf-8', quote_char: '"', force_quotes: true).each do |x| 
    puts x[1] 
end 

結果:25 OF

84.07 FT、26 OF ALL、

関連する問題