簡體   English   中英

在 Ruby 中解析二進制 CSV 文件

[英]Parse binary CSV file in 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 的任何想法?

注意:這是一個下載的 CSV,因此通過在 excel 中打開它並導出(或類似的東西)將其轉換為另一種編碼不是一種選擇:)

謝謝!

使用嘗試的解決方案 1 進行更新:

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

雖然這是正確的,但它只適用於puts ,例如:

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 要點

下載示例 CSV 文件

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM