人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Rubyで平日20時から翌日9時までの間と、土日祝の終日のアラート件数を集計するスクリプトを作成したいです。下記のようなファイルがある場合、そこから上記条件で月ごとの件数を抽出するのが目的です。右端の回数はすべて一回となりますので、単純に「平日20時から翌日9時までの間と、土日祝の終日」の行数がわかればアラート件数となります。

考えてみて、1?4のような手順で作ればよいものかと思うのですが、他に何かよい方法等があればご教示ください。

1.正規表現である月だけ抽出
2.そこから平日の9-19時を除外
3.その行数を出す

ファイル:
日付 時間(hh) 曜日 回数
20080922 5 月 1
20080922 3 月 1
20080922 17 月 1
20080922 1 月 1
20080921 17 日 1
20080921 14 日 1
20080921 5 日 1
20080920 5 土 1
20080916 15 火 1
20080916 5 火 1
20080915 3 月 1
20080915 2 月 1
20080914 10 日 1

●質問者: ikazuo
●カテゴリ:コンピュータ インターネット
✍キーワード:Ruby いもの アラート スクリプト ファイル
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● るびきち
●60ポイント

まず、ファイルの構造に問題があると思います。

年月日がわかれば同時に曜日がわかるので曜日は不要です。

回数が常に1だったら回数というフィールドも不要です。

2以上になるかもしれないので一応加算しておきました。

日付判定はdateライブラリを使いました。

なお、レコードは構造体に落としておくと便利です。

require 'date'
Alerts = Struct.new(:date, :hour, :week, :count)
records = <<EOR
20080922 5 月 1
20080922 3 月 1
20080922 17 月 1
20080922 1 月 1
20080921 17 日 1
20080921 14 日 1
20080921 5 日 1
20080920 5 土 1
20080916 15 火 1
20080916 5 火 1
20080915 3 月 1
20080915 2 月 1
20080914 10 日 1
EOR

class Date
 def holiday?
 false # 面倒なので仮実装
 end
end

puts records.split(/\n/).map {|str|
 date, hour, week, count = str.split
 Alerts.new Date.parse(date), hour.to_i, week, count.to_i
}.select {|a|
 a.date.year == 2008 and a.date.month == 9 and # 2008/9/xx
 [0,6].include?(a.date.wday) or # 土日
 a.date.holiday? or # 祭日
 # 平日の0?9時か20?23時
 ((1..5).include?(a.date.wday) and ((0..9).include? a.hour or (20..23).include? a.hour))
}.inject(0) {|s, a| s + a.count } # 加算
# >> 11

なお、祝日判定は面倒なのでここではやっていません。

◎質問者からの返答

ありがとうございます。

試してみたところ、きちんと欲しい件数が出ました。

業務に役立ちそうです。

コードを読んで理解するところから始めます。

本当にありがとうございます!


2 ● pahoo
●20ポイント

ご質問の手順だと祝日の判定が抜けているようです。


最近はハッピーマンデーなどがあり、ロジックで算出するのは面倒なのですが、「Ruby でカレンダー」の方法がよくできています。

しかし、春分の日・秋分の日については、計算で求めることができません。その前年の2月の閣議で決まるからです。このあたりの事情については「秋分の日と敬老の日の微妙な関係」をご覧ください。

個人的には、祝日は判定テーブルを用意するのが確実だと思います。

◎質問者からの返答

ご指摘ありがとうございます。

それと、春分の日・秋分の日ついても知りませんでした。

教えていただいてありがとうございます。

>祝日は判定テーブルを用意するのが確実だと思います。

調べて試してみます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ