我正在打开一个CSV文件,并使用File.open(filename)从中读取值。
所以我这样做:
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?
感谢。
答案 0 :(得分: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
答案 1 :(得分:2)
您的输入数据看起来像UTF-16 or UCS-2。
尝试这样的事情:
require 'iconv'
ratio = Iconv.conv('UTF-8', 'UTF-16', line_array[1])
puts "Ratio is now '#{ratio}'."
想想看,你应该在调用split之前在整行上运行Iconv.conv,否则在字符串的末尾会有杂散的零字节(除非你将分隔符更改为'\ 000 \ t',看起来很丑陋。)