【问题标题】:Parse binary CSV file in Ruby在 Ruby 中解析二进制 CSV 文件
【发布时间】:2018-03-07 19:06:50
【问题描述】:

这本来应该是一件很容易的事情...买 我一辈子都想不通如何解析似乎没有特定编码的 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 Gist

Download Example CSV File

【问题讨论】:

    标签: ruby-on-rails ruby csv parsing encoding


    【解决方案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
    

    【讨论】:

    • 感谢您的评论!不幸的是,这不起作用:(我会用结果更新我的帖子
    • 如果puts 命令输出了正确的字符串,那么也许下面的内容也可以工作:CSV.read(path, {:headers =&gt; true, :encoding =&gt; 'utf-8'}).map(&amp;:to_s)
    • 感谢您的努力!刚刚将该输出作为编辑粘贴到我的帖子中。似乎仍然有编码。如果您想在 irb 中进行测试,我粘贴在那里的 gist 应该具有相同的编码(如果 github gist 维护它)?
    • 还添加了指向实际文件的链接!
    • 添加了另一个更新.. 这次使用 Filegsub
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2021-12-21
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2021-05-19
    • 2020-05-21
    相关资源
    最近更新 更多