2010-06-22 102 views
0

我打開一個CSV文件並使用File.open(filename)從它讀取值。Ruby - 如何將二進制字符串解壓縮到普通字符串?

所以我做這樣的事情:

my_file = File.open(filename) 
my_file.each_line do |line| 
line_array = line.split("\t") 
ratio = line_array[1] 
puts "#{ratio}" 
puts ratio.isutf8? 
end 

我遇到的問題是在line_array值似乎是在一個陌生的格式。例如,CSV文件的單元格中的一個值是0.86。當我打印出來它看起來像「0。8 6」

所以這種行爲像一個字符串,但我不知道它是如何編碼的。當我嘗試做一些自省:

ratio.isutf8? 
I get this: 
=> undefined method 'isutf8?' for "\0000\000.\0008\0006\000":String 

這是怎麼回事?!如何將比率轉換爲一個普通字符串,然後我可以調用ratio.to_f?

謝謝。

回答

2

看起來您的輸入數據編碼爲UTF-16 or UCS-2

嘗試這樣:

require 'iconv' 

ratio = Iconv.conv('UTF-8', 'UTF-16', line_array[1]) 
puts "Ratio is now '#{ratio}'." 

試想想起來了,你應該要求它分裂之前,整條生產線可能運行Iconv.conv,否則會出現在年底流浪零個字節字符串(除非將您的分隔符更改爲'\ 000 \ t',這看起來相當難看。)

+0

太棒了 - 讓我試試。會告訴你這件事的進展的! – mymmaster 2010-06-22 19:38:11

3

解包二進制字符串通常稱爲解碼。它看起來像是你的數據是UTF-16,但是應該在假設這是真的之前找到你實際使用的編碼(例如,通過調查產生它的工作流程/配置)。

在Ruby 1.9(飛解碼):

my_file = File.open(filename).set_encoding('UTF-16BE:UTF-8') 
# the rest as in the original 

在Ruby 1.8(讀取整個文件,然後進行解碼並解析它,可能不適合超大型文件的工作):

require 'iconv' 

# … 

my_file = File.open(filename) 
my_text = Iconv.conv('UTF-8', 'UTF-16BE', my_file.read) 
my_text.each_line do |line| 
# the rest as in the original 
end 
+0

好的迴應。謝謝! – mymmaster 2010-06-22 20:10:11