-2

コンマで区切られたtxtのデータ行を解析する小さなシステムを書いているので、基本的に、ファイル行を配列に読み込み、配列で.eachを使用し、すべてを「'」で分割してからプッシュしますファイルから作成されたデータベースとして返される保持配列に入れます。2 つ作成しました。最初は正常に動作しますが、そのデータはキーワードを使用して行ごとに保存されます。これは正常に動作し、アクセスしてすべて正常に返します。

このようなテキストデータを含むファイルを使用しています


476,TACKLE,40,25,30,0,0,1,A3F,move description string with, punctuation and t's
477,ANOTHERATTACK,BLAHBLAHBLAH,1,2,3,4

これはデータ解析のようなものです。

だから私は行きます:


$fs  = File_SYstem.new
@path = Dir.getwd.to_S + "/desktop/file.txt"
@data_lines = $fs.file_read_lines(@path)
@data = []
@data_lines.each do |line|
  @data >> line.split(',')
end
return @data
#this would make an array of the lines, each line being an array of its elements, right?

@data = The_Code_Above_In_A_Class.new(@path)
=>@data

@data[0]
=>"354,FISSURE,10,40,50,blah blah blah, the second half of the text."

#hmmmm

@data[0][0]
=>"354"

うまく動作しているように見えますが、最初の数字がバイトとして返されることがあります:O

たとえば、次のようになります。

@data.each do |line|
  puts line[1].to_S #return second element which is name of move
end

これにより、予想される名前のリストが表示されますが、そのリストには、要求していない残りのデータが認識できないパターンで返されます。

多分私はこれを行うことができますか?

array = [1,2,3]
array = [array,array,array]
array[2][0] = "Hello!"
array.each do |item|
  puts item[2]
end
 =>"3"
"3"
"Hello!"
=>:

私はすでにこのスタイルの近いバリエーションを他の場所で使用して成功しているので、これはうまくいくはずです。

これは、実際の 580 行のファイルのサンプルです。


1,MEGAHORN,Megahorn,000,120,BUG,Physical,85,10,0,00,0,abef,Cool,"Using its tough and  impressive horn, the user rams into the target with no letup."
2,ATTACKORDER,Attack Order,000,90,BUG,Physical,100,15,0,00,0,befh,Smart,The user calls out its underlings to pummel the target. Critical hits land more easily.
3,BUGBUZZ,Bug Buzz,046,90,BUG,Special,100,10,10,00,0,bek,Cute,The user vibrates its wings to generate a damaging sound wave. It may also lower the target's Sp. Def stat.

これは、ロードするために使用するクラスです。

class Move_Data_Extracter
  def initialize(path)
        load $path.to_s + "/source/string_helper.rb"
    #load "/mnt/sdcard/pokemon/system/source/string_helper.rb"
        @path = path.to_s
    @file_lines = $file_system.file_read_lines(@path.to_s)
    $movedata = []
    @file_lines.each do |line|
      $movedata << line.split(",")
    end
  end
  def get_move_id(move_name)
    $movedata.each do |move|
      if move[1].upcase.to_s == move_name.upcase.to_s
            return move[0].to_i
      else
        return "Move Doesnt Exist In The System!"
      end
    end
  end
 end

これは、返された配列の最初のアイテムにアクセスしたときに得たフィードバックです。


irb(main):002:0> $movedata[0]
=> ["\xEF\xBB\xBF1", "MEGAHORN", "Megahorn", "000", "120", "BUG", "Physical", "8
5", "10", "0", "00", "0", "abef", "Cool", "\"Using its tough and impressive horn
", " the user rams into the target with no letup.\"\n"]
irb(main):003:0> $movedata[0][0]
=> "\xEF\xBB\xBF1"
irb(main):004:0>

今回はアクセスはうまくいきましたが、最初の要素はバイトであり、私が試みている各メソッドはうまくいきません。

誰でもここで何が悪いのか理解できますか?

4

1 に答える 1

1

まず第一に、それは明らかにあなたが使用しているコードではありません。のようなものto_Sはルビーの一部ではなく、とにかくすぐに失敗するからです。

コードを少しクリーンアップしましょう:

# $fs  = File_SYstem.new # this is just not needed
path = File.expand_path "/desktop/file.txt" # instance variables *only* within explicit objects
data_lines = File.read( path ).split ","

あなたが書いた残りの部分が本当に何を意味するのか私にはわかりません。

これは以下を出力します:

# => ["476", "TACKLE", "40", "25", "30", "0", "0", "1", "A3F", "move description string with", " punctuation and t's\n477", "ANOTHERATTACK", "BLAHBLAHBLAH", "1", "2", "3", "4"]

このコードのビット-それは何ですか?

array = [1,2,3]
array = [array,array,array] # pure craziness!
array[2][0] = "Hello!"
array.each do |item|
  puts item[2]
end
 =>"3"
"3"
"Hello!"
=>:

バイトが返される理由は、ファイルが(おそらく)UTF-8としてエンコードされているためです。File.read( path, "r:UTF-8")Rubyに正しいエンコーディングを使用させるようにしてください。

于 2012-11-04T08:36:56.893 に答える