0

私はrubyを使用して、次の形式のテキストファイルを解析しようとしています...

AAB eel bbc 
ABA did eye non pap mom ere bob nun eve pip gig dad nan ana gog aha
    mum sis ada ava ewe pop tit gag tat bub pup
    eke ele hah huh pep sos tot wow aba ala
    bib dud tnt 
ABB all see off too ill add lee ass err xii ann fee vii inn egg odd bee dee goo
    woo cnn pee fcc tee wee ebb edd gee ott ree vee ell orr rcc att boo cee cii
    coo kee moo mss soo doo faa hee icc iss itt kii loo mee nee nuu ogg opp pii
    tll upp voo zee

「AAB」などの最初の列で検索してから、そのキーに関連付けられているすべての値を検索できるようにする必要があります。テキストファイルを配列のハッシュにインポートしようとしましたが、格納する最初の値を超える値を取得できませんでした。データを何らかのデータ構造に格納する方法でも、毎回テキストファイルを検索するだけでも、ファイルを検索する方法については好みがありません。それができる必要があります。私はこれをどのように進めるかについて途方に暮れています、そしてどんな助けでも大いに感謝されるでしょう。ありがとう

-amc25114

4

3 に答える 3

3

これにより、辞書ファイルが読み取られます。コンテンツを文字列に格納し、それを StringIO オブジェクトに変換して、ファイルであると見なすようにしています。File.readlinesファイル自体から直接読み取るために使用でき ます。

require 'pp'
require 'stringio'

text = 'AAB eel bbc 
ABA did eye non pap mom ere bob nun eve pip gig dad nan ana gog aha
    mum sis ada ava ewe pop tit gag tat bub pup
    eke ele hah huh pep sos tot wow aba ala
    bib dud tnt 
ABB all see off too ill add lee ass err xii ann fee vii inn egg odd bee dee goo
    woo cnn pee fcc tee wee ebb edd gee ott ree vee ell orr rcc att boo cee cii
    coo kee moo mss soo doo faa hee icc iss itt kii loo mee nee nuu ogg opp pii
    tll upp voo zee
'

file = StringIO.new(text)

dictionary = Hash[
  file.readlines.slice_before(/^\S/).map{ |ary| 
    key, *values = ary.map(&:strip).join(' ').split(' ')
    [key, values] 
  }
]

dictionary次のようなハッシュです。

{
  "AAB"=>[
    "eel", "bbc"
  ],
  "ABA"=>[
    "did", "eye", "non", "pap", "mom", "ere", "bob", "nun", "eve", "pip",
    "gig", "dad", "nan", "ana", "gog", "aha", "mum", "sis", "ada", "ava",
    "ewe", "pop", "tit", "gag", "tat", "bub", "pup", "eke", "ele", "hah",
    "huh", "pep", "sos", "tot", "wow", "aba", "ala", "bib", "dud", "tnt"
  ],
  "ABB"=>[
    "all", "see", "off", "too", "ill", "add", "lee", "ass", "err", "xii",
    "ann", "fee", "vii", "inn", "egg", "odd", "bee", "dee", "goo", "woo",
    "cnn", "pee", "fcc", "tee", "wee", "ebb", "edd", "gee", "ott", "ree",
    "vee", "ell", "orr", "rcc", "att", "boo", "cee", "cii", "coo", "kee",
    "moo", "mss", "soo", "doo", "faa", "hee", "icc", "iss", "itt", "kii",
    "loo", "mee", "nee", "nuu", "ogg", "opp", "pii", "tll", "upp", "voo", "zee"
  ]
}

次のキーを使用して検索できます。

辞書['AAB']
=> [「ウナギ」、「bbc」]

そして、次を使用して配列内を検索しinclude?ます。

辞書['AAB'].include?('ウナギ')
=>真
辞書['AAB'].include?('foo')
=>偽
于 2013-02-20T03:41:33.740 に答える
0

私の2セント:

file = File.open("/path_to_file_here")
recent_key = ""
results = Hash.new
while (line = file.gets)
  key = line[/[A-Z]+/]
  recent_key = key if key
  line.scan(/[a-z]+/).each do |val|
    results[recent_key.to_sym] = [] if !results[recent_key.to_sym]
    results[recent_key.to_sym] << val
  end
end
puts results 

これにより、次の出力が得られます。

{

:AAB=>["ウナギ", "bbc"],

:ABA=>["did", "eye", "non", "pap", "mom", "ere", "bob", "nun", "eve", "pip", "gig", "お父さん」、「ナン」、「アナ」、「ゴグ」、「アハ」、「マム」、「シス」、「アダ」、「アヴァ」、「エウェ」、「ポップ」、「ティット」、「ギャグ」 、「tat」、「bub」、「pup」、「eke」、「ele」、「hah」、「huh」、「pep」、「sos」、「tot」、「wow」、「aba」、」アラ」、「ビブ」、「ダッド」、「tnt」]、

 :ABB=>["all", "see", "off", "too", "ill", "add", "lee", "ass", "err", "xii", "ann","料金」、「vii」、「inn」、「egg」、「odd」、「bee」、「dee」、「goo」、「woo」、「cnn」、「pee」、「fcc」、「tee」 、「wee」、「ebb」、「edd」、「gee」、「ott」、「ree」、「vee」、「ell」、「orr」、「rcc」、「att」、「boo」、「 cee"、"cii"、"coo"、"kee"、"moo"、"mss"、"soo"、"doo"、"faa"、"hee"、"icc"、"iss"、"itt" 、「きい」, "loo", "mee", "nee", "nuu", "ogg", "opp", "pii", "tll", "upp", "voo", "zee"]

}
于 2013-02-19T23:54:58.923 に答える
0
class A

  def initialize
    @h, key = readlines.inject({}) do |m, s|
      a = s.split
      m[key = a.shift] = [] if s =~ /^[^\s]/
      m[key] += a
      m
    end
  end

  def lookup k, v # not sure what you really want to do here
    p [k, v, (@h[k].index v)]
  end

  self
end.new.lookup 'ABA', 'wow'
于 2013-02-19T23:34:58.017 に答える