今日も元気にテクニカル

技術情報書きたいけど本ブログに書きたくないからこんな名前になりました。

(小ネタ続き)取得した人狼BBS参加者リストを解析

参加者IDをこんな感じでテキストファイルに保存。

=====501村=====
master
knight
・
・
・
seena
totoro
=====502村=====
master
yamadayama
・
・
・
bdheki
turugi

これを以下のスクリプトで解析

require 'benchmark'
puts Benchmark.measure {
  file = File.open("C:/share/jinro_list.txt")
  @arr = Array.new
  file.each_line do |line|
    line = line.chomp!
    next if line =~ /=====/
    if @arr.assoc(line)
      elem = @arr.assoc(line)
      @arr.delete(@arr.assoc(line))
      @arr << [line,elem[1] + 1]
    else
      @arr << [line,1]
    end
  end
}

@arr.each do |elem|
  puts elem.join("\t")
end

@arrは2重配列でデータベース的役割を果たす。
1回目に登場したIDは[ID名、1]の形式で@arrに入力。
2回目以降は[ID名、登場回数]を[ID名、登場回数+1]とする。
最後にお約束のarr.eachで出力して終了。

#assocは2重配列を処理するのにすごぶる便利な関数です。

#assocは2重配列の0番目の要素を検索し、ヒットすると配列を返す。

# ID,参加回数の形式で収納
arr = [
["master",5],
["teraco",1],
["dolp",8],
["namayo",13],
["aiko",2]
]

# xの参加回数を調べる場合
p arr.assoc("namayo") #=> ["namayo", 13]
p arr.assoc("namayo")[1] #=> 13

欠点は最初にヒットした要素しか返さないこと。0番目の要素をキーとしユニークとなる配列を組む必要がある。
2重配列の1番目の要素を検索し、ヒットすると配列を返す#rassocメソッドもご参考。