解析Ruby中的二进制CSV文件

问题描述:

这应该是这么容易的事情......买我不能为我的生活弄清楚如何解析一个似乎没有特定编码的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的任何想法?

注:这是一个下载的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

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