Ruby - Как распаковать двоичную строку в обычную строку? - PullRequest
0 голосов
/ 22 июня 2010

Я открываю файл CSV и читаю значения из него, используя File.open (имя файла).

Поэтому я делаю что-то вроде этого:

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 8"

Так что это ведет себя как строка, но я не уверен, как она закодирована.Когда я пытаюсь сделать некоторый самоанализ:

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

Что, черт возьми, происходит ?!Как я могу получить соотношение в обычной строке, которую я могу затем назвать ratio.to_f?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 22 июня 2010

Распаковка двоичной строки обычно называется декодированием. Похоже, ваши данные находятся в 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
2 голосов
/ 22 июня 2010

Похоже, ваши входные данные закодированы как UTF-16 или UCS-2 .

Попробуйте что-то вроде этого:

require 'iconv'

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

Если подуматьВам, вероятно, следует запустить Iconv.conv на всю строку перед вызовом split для нее, иначе в конце строк будут нулевые байты (если вы не измените свой разделитель на '\ 000 \ t', что выглядит довольно некрасиво.)

...