- ベストアンサー
rubyアクセス解析を実現する方法
- 質問者は、アクセスログを読み込んで、日ごとおよび3時間ごとのアクセス数を計算するプログラムを作成したいとしています。
- 最終的には、「日/月/年 00:00:00 ~ 02:59:59」のような形式でアクセス数を表示したいとのことです。
- この質問に対して、rubyを使用してアクセス解析を実現する方法を提案しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
すみません。元の質問に3時間ごとというのはありましたね。 MTABLE = { 'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 'Sep' => 9, 'Oct' =>10, 'Nov' =>11, 'Dec' =>12 } def sort_filter(item) s = item.split '/' s[1] = MTABLE[s[1]] s.reverse end hash_of_days = {} DATA.each do |line| line.chomp! d = %r{\[ ( \d{1,2} / \w+ / \d{4}) : ((\d\d):\d\d:\d\d)}xo.match(line) next unless d r = d[3].to_i / 3 hash_of_days[d[1]] ||= Array.new(8,0) hash_of_days[d[1]][r] += 1 end TIME_TABLE = [ "00:00:00 ~ 02:59:59", "03:00:00 ~ 05:59:59", "06:00:00 ~ 08:59:59", "09:00:00 ~ 11:59:59", "12:00:00 ~ 14:59:59", "15:00:00 ~ 17:59:59", "18:00:00 ~ 20:59:59", "21:00:00 ~ 23:59:59" ] hash_of_days.keys.sort_by{|item| sort_filter(item) }.each do |l| hash_of_days.each_with_index do |x, i| next if hash_of_days[l][i] == 0 puts "#{l} #{TIME_TABLE[i]} #{hash_of_days[l][i]}" end end __END__ ahirhif[21/Apr/2007:03:12:01 +0900] huahiuhsi hfruoho[15/Jul/2006:09:17:05 +0900] hfurihure hifhier[01/Jun/2006:12:12:57 +0900] huisauhsi ieiuruo[21/Apr/2007:08:15:25 +0900] ruioopqqe ahirhif[17/Apr/2007:03:13:03 +0900] huahiuhsi hfruoho[18/Sep/2006:01:11:15 +0900] hfurihure hifhier[09/Jun/2006:13:13:59 +0900] huisauhsi ieiuruo[21/Apr/2007:09:20:21 +0900] ruioopqqe 実行例: 01/Jun/2006 12:00:00 ~ 14:59:59 1 09/Jun/2006 12:00:00 ~ 14:59:59 1 15/Jul/2006 09:00:00 ~ 11:59:59 1 18/Sep/2006 00:00:00 ~ 02:59:59 1 17/Apr/2007 03:00:00 ~ 05:59:59 1 21/Apr/2007 03:00:00 ~ 05:59:59 1 21/Apr/2007 06:00:00 ~ 08:59:59 1 21/Apr/2007 09:00:00 ~ 11:59:59 1 基本的には#1のスクリプトと考えた方は同じで、 日付文字列をキーにしたハッシュを使って回数をカウントしておいて、 あとでまとめて出すというものです。 ハッシュが保持するのは配列で(ここが#1と違う)、 0時台から23時台まで三時間ごとにわけ、それぞれが配列の0~7番目に該当します。 各メソッドがどういうものかわからない場合にはご自分で オンラインマニュアルでも参照してください。
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
月の名前がフルスペルなのか三文字の略称なのかはっきりしないとか >日/月/年 00:00:00 ~ 02:59:59 アクセス数 この時間帯は 00:00:00 ~ 23:59:59 の間違いなのか? 正しいのならば他の時間帯はどうするのか不明とかいろいろ 確認したいことはありますが、こんな感じですかね。 ファイルから読むようにするとか、月の名前をフルスペルのものにしたいとか 出力フォーマットについては自分で調整してください。 MTABLE = { 'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 'Sep' => 9, 'Oct' =>10, 'Nov' =>11, 'Dec' =>12 } def sort_filter(item) s = item.split '/' s[1] = MTABLE[s[1]] s.reverse end hash_of_days = Hash.new(0) DATA.each do |line| line.chomp! d = %r{\[ ( \d{1,2} / \w+ / \d{4}) : (\d\d:\d\d:\d\d)}xo.match(line) hash_of_days[d[1]] += 1 end hash_of_days.keys.sort_by{|item| sort_filter(item) }.each do |k| puts "#{k} #{hash_of_days[k]}" end __END__ ahirhif[21/Apr/2007:03:12:01 +0900] huahiuhsi hfruoho[15/Jul/2006:09:17:05 +0900] hfurihure hifhier[01/Jun/2006:12:12:57 +0900] huisauhsi ieiuruo[21/Apr/2007:08:15:25 +0900] ruioopqqe ahirhif[17/Apr/2007:03:13:03 +0900] huahiuhsi hfruoho[18/Sep/2006:01:11:15 +0900] hfurihure hifhier[09/Jun/2006:13:13:59 +0900] huisauhsi ieiuruo[21/Apr/2007:09:20:21 +0900] ruioopqqe 実行結果: 01/Jun/2006 1 09/Jun/2006 1 15/Jul/2006 1 18/Sep/2006 1 17/Apr/2007 1 21/Apr/2007 3
補足
日/月/年 00:00:00 ~ 02:59:59 アクセス数 日/月/年 03:00:00 ~ 05:59:59 アクセス数 日/月/年 06:00:00 ~ 08:59:59 アクセス数 このように3時間ごとのアクセス数をだしたかったんです。