0

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ファイルのセルの値の1つは0.86です。印刷すると「0.86」のようになります

つまり、文字列のように動作しますが、どのようにエンコードされているのかわかりません。私が内省しようとすると:

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

一体何が起こっているのですか?!比率を通常の文字列に変換して、ratio.to_fを呼び出すにはどうすればよいですか?

ありがとう。

4

2 に答える 2

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
于 2010-06-22T19:18:17.613 に答える
2

入力データはUTF-16またはUCS-2としてエンコードされているようです。

次のようなものを試してください。

require 'iconv'

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

考えてみると、splitを呼び出す前に、行全体でIconv.convを実行する必要があります。そうしないと、文字列の最後にゼロバイトが含まれます(区切り文字を「\ 000 \ t」に変更しない限り)。かなり醜いです。)

于 2010-06-22T17:55:11.147 に答える