2017-09-26 18 views
1

これは簡単なことでした...私の人生では、特定のエンコーディングを持たないようなCSVファイルを解析する方法がわかりません。Rubyでバイナリ形式のCSVファイルをパースする

File.open(Rails.root.join('data', 'mike/test-csv.csv'), 'rb') { |f| f.read } 
=> "ID,\x00Q\x00u\x00a\x00n\x00t\x00i\x00t\x00y\n\x006\x00e\x005\x004\x009\x001\x00e\x007\x00-\x007\x00f\x001\x005\x00-\x004\x001\x007\x00d\x00-\x00a\x004\x000\x003\x00-345\x00,\x00\x005\x000\x00.\x000\x000\x000\x000\x000\x000\x000\x000\x00\n" 

ここでは、その要点ですが、特定のCSVを投稿する方法を見つけることができません。

ファイルのエンコーディングをチェックするのは、それがバイナリ形式であることです。どのようにすれば普通のCSVファイルに変換できますか?

注:これには、Excelでそれを開き、エクスポートを介して他のエンコーディングに変換する(またはそのようなことは)オプションではありませんダウンロードしたCSVです:)

ありがとう!例えば、これは正しいですが、それだけでputsで動作します

path = Rails.root.join('data', 'mike/test-csv.csv') 
CSV.read(path, {:headers => true, :encoding => 'utf-8'}).each do |d| 
    puts d 
end 
Result: 6e5491e7-7f15-417d-a403-345,50.00000000 

未遂ソリューション1で更新

CSV.read(path, {:headers => true, :encoding => 'utf-8'}).map { |row| row } 
=> [#<CSV::Row "ID":"\u00006\u0000e\u00005\u00004\u00009\u00001\u0000e\u00007\u0000-\u00007\u0000f\u00001\u00005\u0000-\u00004\u00001\u00007\u0000d\u0000-\u0000a\u00004\u00000\u00003\u0000-345\u0000" "\u0000Q\u0000u\u0000a\u0000n\u0000t\u0000i\u0000t\u0000y":"\u0000\u00005\u00000\u0000.\u00000\u00000\u00000\u00000\u00000\u00000\u00000\u00000\u0000">] 

CSV.read(path, {:headers => true, :encoding => 'utf-8'}).map(&:to_s) 
=> ["\u00006\u0000e\u00005\u00004\u00009\u00001\u0000e\u00007\u0000-\u00007\u0000f\u00001\u00005\u0000-\u00004\u00001\u00007\u0000d\u0000-\u0000a\u00004\u00000\u00003\u0000-345\u0000,\u0000\u00005\u00000\u0000.\u00000\u00000\u00000\u00000\u00000\u00000\u00000\u00000\u0000\n"] 

それはまだ、残念ながら正しい文字列ではありません:(

最終解決策(下記の@ashmaroli経由):

path = Rails.root.join('data', 'mike/test-csv.csv') 
csv_text = '' 

File.open(path, 'r') do |csv| 
    csv.each_line do |line| 
    csv_text << line.gsub(/\u0000/, '') 
    end 
end 

CSV.parse(csv_text, headers:true).map do |row| row end 

結果:コメントを

[#<CSV::Row "ID":"6e5491e7-7f15-417d-a403-345" "Quantity":"50.00000000">] 

Github Gist

Download Example CSV File

答えて

1
path = Rails.root.join('data', 'mike/test-csv.csv') 
file = "" 

File.open(path, 'r') do |csv| 
    csv.each_line do |line| 
    file << line.gsub(/\u0000/, '') 
    end 
end 
print file 
print file.inspect # same as above just wraps the string in a 
        # single line with "\n" chars 
+0

感謝!残念ながら、これはうまくいきません:(私の投稿を更新します –

+0

大丈夫、出力文字列の例は? – ashmaroli

+0

もし 'puts'コマンドが正しい文字列を出力したら、おそらく次のように動作するはずです:** 'CSV.read(path、{:headers => true、:encoding => 'utf-8'})map(&:to_s)' ** – ashmaroli

関連する問題