0

私の ruby​​ スクリプトはログをフィルタリングし、このようなハッシュを生成します

scores = {"Rahul" => "273", "John"=> "202", "coventry" => "194"}

明らかなキーの複数の値をスキップすることにより

ログファイルはこのようになります

ラフルは 273 ラフルは 217 ジョンは 202 コベントリーは 194

このようなものを生成することは可能ですか

scores = {"Rahul" => "273", "Rahul" =>"217",
          "John"=> "202", "coventry" => "194"}

scores = {"Rahul" => "273","217",
          "John"=> "202", "coventry" => "194"}

キーがハッシュに既に存在している場合でも、強制的にハッシュに書き込む方法はありますか

私はどんな助けや提案にも感謝します

4

2 に答える 2

4
"Rahul has 273 Rahul has 217 John has 202 Coventry has 194".
  scan(/(\w+) has (\d+)/).group_by(&:shift)
#⇒ {"Rahul"=>[["273"], ["217"]],
#   "John"=>[["202"]],
#   "Coventry"=>[["194"]]}

値の平坦化については、以下の Johan Wentholt によるコメントを確認してください。

于 2018-03-14T09:24:05.610 に答える
1

スコアを保存するには、デフォルト値として空の配列を持つハッシュを作成できます。

scores = Hash.new { |hash, key| hash[key] = [] }

scores['Rahul'] #=> [] <- a fresh and empty array

ログから値を抽出し、それぞれのキーの値に追加できるようになりました。ブロックで使用しています:(ムダソバの回答scanのパターンを使用)

log = 'Rahul has 273 Rahul has 217 John has 202 Coventry has 194'

log.scan(/(\w+) has (\d+)/) { |name, score| scores[name] << score.to_i }

scores #=> {"Rahul"=>[273, 217], "John"=>[202], "Coventry"=>[194]}

必須ではありませんが、配列に追加する前に各スコアを整数に変換しました。

于 2018-03-14T11:40:20.913 に答える