2

「\u0161\u010D\u0159\u017E\u00FD」などの UTF-8 形式の文字列を使用すると問題が発生します。そのような文字列が私のプログラムで変数として定義されている場合、正常に動作します。しかし、そのような文字列を外部ファイルから読み取って使用すると、間違った出力が得られます(必要な/期待するものが得られません)。確かに、必要なエンコーディングがいくつか欠けています...

私のコード:

file  = "c:\\...\\vlmList_unicode.txt" #\u306b\u3064\u3044\u3066
data = File.open(file, 'rb') { |io| io.read.split(/\t/) }
puts data
data_var = "\u306b\u3064\u3044\u3066"
puts data_var

出力:

\u306b\u3064\u3044\u3066 # what I don't want
について # what I want

「rb」を指定してバイナリ形式でファイルを読み取ろうとしていますが、明らかに他に問題があります...JRuby 1.7.3でビルドしてNetbeans 7.3.1でコードを実行します(Ruby 2.0.0も試しましたでも効果なし。)

私はRubyの世界に慣れていないので、どんなアイデアでも大歓迎です...

4

2 に答える 2

0

参考までに:

data = File.open(file, 'rb') { |io| io.read.split(/\t/) }

次のいずれかのように、より簡単に記述できます。

data = File.read(file, 'rb').split(/\t/)
data = File.readlines(file, "\t", 'mode' => 'rb')

( File は、これらのメソッドが定義されている場所である IO から継承されることに注意してください。そのため、それらに関するドキュメントについてはIOを参照してください。)

readlines上記の例では "\t" である "separator" パラメータを取ります。Ruby は、*nix または Mac OS では通常の「\n」、または Windows では「\r\n」に置き換えるため、レコードはタブ区切り文字を使用して取得されます。

これは、なぜあなたがそれをしたいのか、少し疑問に思いますか?タブをレコード区切り記号として見たことはありません。「TSV」(Tab-Seperated-Value) ファイルの列/フィールド区切り記号のみです。したがって、列区切り記号として「\t」を使用して、おそらく Ruby のCSVクラスを使用する必要があると思います。しかし、あなたが読んでいる実際のファイルのサンプルがなければ、確かなことは言えません。

于 2013-07-24T15:48:43.013 に答える