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">]
感謝!残念ながら、これはうまくいきません:(私の投稿を更新します –
大丈夫、出力文字列の例は? – ashmaroli
もし 'puts'コマンドが正しい文字列を出力したら、おそらく次のように動作するはずです:** 'CSV.read(path、{:headers => true、:encoding => 'utf-8'})map(&:to_s)' ** – ashmaroli