RubyでHashのsort

アクセスログをとっているのですが、そろそろどんな感じか整理してみようということで、Rubyでスクリプトを書いてみました。データの保管にはPStoreを使っているので、プログラムにはHashをいじっているのと同じ感覚でログの抽出操作ができるのです。

で、ここで問題となるのがHashのソート。今回はHashのキーにURL、値にアクセス回数が入っているものとして、アクセス回数の多いものを優先に、かつ、回数が等しいものはアルファベット順に整理してみることにしました。
この機能は次のコードで実現できます。

hash = {'http://www.yahoo.co.jp/' => 3, 'http://www.google.co.jp/' => 3, 'https://fenrir.naruoka.org/' => 5}
hash.to_a.sort{|a, b|
    (b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
}
# => [['https://fenrir.naruoka.org/', 5], ['http://www.google.co.jp/', 3], ['http://www.yahoo.co.jp/', 3]]

これで目的のソート済み配列([[key, value], [key, value],…]の二重配列になっています)が得られるので、後はeachかなんかでイテレーションすれば目的の操作ができると思います。
いちおう解説すると、to_aでHashのArray化⇒[[key, value], [key, value],…]の二重配列ができる⇒sortする、sortのブロック内の戻り値が大きい順に配列は並び替えられる、という手順をとっています。

今回作成したスクリプトの成果は、右上のカウンタをクリックしてみてください。アクセスログが見られます。

あと、こんなサイトを見つけました。ドキュメントがしょぼいRubyにとっては初心者の方には役に立つかも。
『逆引きRuby』

October 28, 2003 23:38 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

田島です。
お。結構カスタマイズしてるね。かっこえーじゃん。

アクセスログ解析、自分で書くのもいいけど(俺も自分で書こうとしてパイチャートのFlashまで作ったのに途中で飽きてやめちゃいました。)
これが結構いいかもよ。
http://awstats.sourceforge.net

そいじゃ、これからもちょくちょく見に来まーす。

Posted by: tomo : October 29, 2003 12:22 AM

Apacheのログを管理するツールのようですね。自分でつくると見栄えまわりがどうもしょぼくなってしまうので、近日中にこれをいれてみようかと。
また来てね~。

Posted by: fenrir : October 29, 2003 07:00 PM

コメントする