- ベストアンサー
カウント結果をカレンダー表示するプログラムを教えてください
- サイトのアクセス数をカウントして、カレンダーデザインで表示したファイル出力できるperlプログラムを教えてください。
- カウント済みファイル1(格納形式:カウント数 日付)があります。
- これを 下記のような形式で表示したいです。 2010-10 Sun, Mon, Tue, Wed, Thu, Fri, Sat , , , , , 10, 11 8, 0, 0, 0, 0, 4, 6 … 2010-11 Sun, Mon, Tue, Wed, Thu, Fri, Sat , 3 ,… どのようにすると上記のようなカレンダー上に カウント数を表示できるのか 教えてください。よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
適当。表示がずれるので空白2文字を全角空白で書いていることに注意。 #!/usr/bin/perl use strict; use warnings; use Time::Local; my %count_of = (); while ( my $line = <DATA> ) { if ( $line =~ m/(\d+)\s+(\d+)-(\d+)-(\d+)/ ) { my $count = $1; my $year = $2; my $month = $3; my $day = $4; $count_of{$year}->{$month}->{$day} = $count; } } for my $year ( sort keys %count_of ) { for my $month ( sort keys %{ $count_of{$year} } ) { print "$year-$month", $/; print "Sun, Mon, Tue, Wed, Thu, Fri, Sat", $/; my $time = timelocal( 0, 0, 0, 1, $month - 1, $year ); my ($wday) = ( localtime $time )[6]; my $end_mday = get_end_mday($year, $month); for my $count ( 1 .. ($end_mday + $wday)) { my $day = sprintf '%02d', $count - $wday; if ( exists $count_of{$year}->{$month}->{$day} ) { print $count_of{$year}->{$month}->{$day}; } elsif ( 1 <= $day ) { print '0'; } if ( ( $count % 7 ) == 0 ) { print $/; } else { print q{,}; } } print $/; } } sub get_end_mday { my $year = shift; my $month = shift; if ( $month >= 12 ) { $month = 0; } my $time = timelocal( 0, 0, 0, 1, $month, $year ) - ( 24 * 60 * 60 ); my ($mday) = ( localtime $time )[3]; return $mday; } __DATA__ 10 2010-10-01 11 2010-10-02 8 2010-10-03 4 2010-10-08 6 2010-10-09 3 2010-11-01
その他の回答 (1)
- kmee
- ベストアンサー率55% (1857/3366)
まずは、カレンダーの表示自体はできますか? カレンダーは、表示する枠(第何週の何曜日)に、その枠の日付の数字を表示します。 その「日付の数字」の代わりにカウント数を表示すればよいわけです。 日付とカウントの関連付けは、ハッシュを使うとよいでしょう 細かい点は省略します。 %count=() ; open FP,'<', 'カウント済みファイル1' ; while(<FP>){ # 正規表現でカウントと日付を取り出す if( /^(\d+)\s+\(\d+-\d+-\d+)/ ){ $count{$2}=$1; } close FP; #$y=年 ; #$m=月 ; #$d=日付 ; でループしている中での表示の例 print $count{sprintf("%04d-%02d-%02d", $y,$m,$d) }
お礼
回答ありがとうございます。 私も考えていた要領でしたので、やり方理解できました。 アドバイスに基づき、トライしてみたいと思います。
お礼
詳細のプログラム説明 ありがとうございます。 カレンダー出力の仕組みも含め、理解できました。 参考にして、プログラム動かしてみたいと思います。