• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:カウント結果をカレンダー表示するプログラムを教えてください)

カウント結果をカレンダー表示するプログラムを教えてください

このQ&Aのポイント
  • サイトのアクセス数をカウントして、カレンダーデザインで表示したファイル出力できる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 ,… どのようにすると上記のようなカレンダー上に カウント数を表示できるのか 教えてください。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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

1204533
質問者

お礼

詳細のプログラム説明 ありがとうございます。 カレンダー出力の仕組みも含め、理解できました。 参考にして、プログラム動かしてみたいと思います。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

まずは、カレンダーの表示自体はできますか? カレンダーは、表示する枠(第何週の何曜日)に、その枠の日付の数字を表示します。 その「日付の数字」の代わりにカウント数を表示すればよいわけです。 日付とカウントの関連付けは、ハッシュを使うとよいでしょう 細かい点は省略します。 %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) }

1204533
質問者

お礼

回答ありがとうございます。 私も考えていた要領でしたので、やり方理解できました。 アドバイスに基づき、トライしてみたいと思います。

関連するQ&A