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

この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 ,… どのようにすると上記のようなカレンダー上に カウント数を表示できるのか 教えてください。よろしくお願いいたします。
回答を見る
  • ベストアンサー

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

カウント結果をカレンダー表示するプログラムを教えてください サイトのアクセス数をカウントして、カレンダーデザインで表示したファイル出力できるperlプログラムを教えてください。 カウント済みファイル1(格納形式:カウント数 日付)があります。 10 2010-10-01 11 2010-10-02 8 2010-10-03 4 2010-10-08 6 2010-10-09 … 3  2010-11-01 … これを 下記のような形式で表示したいです。 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 ,… どのようにすると上記のようなカレンダー上に カウント数を表示できるのか 教えてください。よろしくお願いいたします。

  • Perl
  • 回答数2
  • ありがとう数4

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

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

  • plorogプログラミング

    たとえば /*ミラノ:ロンドン*/ timetable(mil,lon,[0735,0845,az226,[sun,mon,tue,wed,thu,fri,sat]]). timetable(mil,lon,[0755,0900,ba571,[sun,mon,tue,wed,thu,fri,sat]]). timetable(mil,lon,[0815,0925,ba561,[sun,mon,tue,wed,thu,fri,sat]]). timetable(mil,lon,[1020,1125,az228,[sun,mon,tue,wed,thu,fri,sat]]). timetable(mil,lon,[1130,1230,ba565,[sun,mon,tue,wed,thu,fri,sat]]). というフライトデータがあるとして、ここからフライト時間を割り出すにはどうしたらいいんでしょうか? 述語が分かる方お願いします。

  • カレンダー sun(日)の横にDimと書いてあります

    2009年のカレンダーを買いました。 曜日を意味する、sundayやmondayは分かります。 しかし、その横に、Dimとか、各曜日の横に3文字書いてあります。 何の意味か分かりません。 ご存知の方、Dimなどが、何の略かも、どうか教えてください。 sun/Dim mon/Lun Tue/Mar Wed/Mer Thu/Jeu Fri/Ven Sat/Sam

  • perl qw(aaa bbb ccc)[$hoge]のような記述

    my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $wday = sprintf("%s", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]); 2行目のsprintfですが、qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]はどのようなことが行われているのでしょうか? sprintf("%s", "hello world!");みたいな基本的なものならsprintfの使い方はわかります。ですが、qw(aaa bbb ccc)[$hoge]のような記述についてがわかりません。 上記の例でいえば、どういう結果になるのかはわかるのですが、どういう過程で代入されているのかがわかりません。 qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]という書式はどういうことが行われているのか教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 時計の曜日表示について

    先日、アナログでSEIKOの腕時計をプレゼントしていただいたのですが、この時計の曜日表示をまわしてみてみると、 MON.LUN.TUE.MAR.WED.MIE.THU.JUE.FRI.VIE.SAT.SAB.SUN.DOM というような感じで並んでいるんです。2つペアで月曜から日曜まで並んでいるのはわかりますが、はじめのほうは英語でいいのですが、後のほうの読み方が分かりません。いちおう調べてみたのですが、上手く当てはまる言語がないのです。 どなたか分かる方がいたら、教えて下さい。

  • 時計のDOMやらLUNって何でしょう?英語?

    オークションで 中古の外国製の腕時計を購入したのですが、 曜日の事でわからないことが あります。 それは、日、月、火と続くのではなくて SUN → DOM MON → LUN TUE → MAR WED → MIER THU → JUEV FRI → VIER SAT → SAB と、変わっていくんです。 なんとなくはわかるのですが これが何を意味しているのか 教えてください。

  • 万年カレンダー

    万年カレンダー作ろうとしているのですが、ここからの作り方がわかりませんので、教えてください。 int youbi_chk(int,int,int); int uru_chk(int); void main(void) { int yy,mm; char week[7][4]={\"SUN\", \"MON\", \"TUE\", \"WED\", \"THU\", \"FRI\", \"SAT\"}; int mday[12]={31,28,31,30,31,30,31,31,30,31,30,31}; printf(\"年(西暦:4桁)を入力して下さい:\"); scanf(\"%d\",&yy); printf(\"月を入力して下さい:\"); scanf(\"%d\",&mm);

  • Excel - ちょっとややこしい値の引き方

    宜しくお願いします。 文字で説明するのが難しいのですが、例えば。 Sheet1が【集計表】、Sheet2が【データ】(数字で入力)というブックがあるとしまして、【データ】から【集計表】に、曜日ごとの合計値を引きたいとします。 --------------------------------------------  Sun Mon Tue Wed Thu Fri Sat A B C -------------------------------------------- こんな表になります。 そしてA,B,Cは任意に入力できるようにして、例えばAであれば、【データ】シート上の[A1:C10]というように、引いてくる元の範囲を可変にするとします。ABCに対する範囲は固定で、ABCの横に並んだ状態であらかじめ用意されているとします。 -------------------------------------------- A A1:C10 B D1:F10 C G1:I10  Sun Mon Tue Wed Thu Fri Sat □ □ □ ↑任意のアルファベットを入れます -------------------------------------------- こういう状態です。 ここで、例えばCの項目の、日曜日の合計を出そうと思ったら、範囲はINDIRECTか何かで引くとして、SUMIF?SUMPRODUCT?どのようにすれば良いでしょうか。色々試してみたのですが、何故かどれも0になってしまいまして。 (SunのセルをE2とします)

  • Suzukaで時計のflashを作成し、曜日も表示されるようにしました

    Suzukaで時計のflashを作成し、曜日も表示されるようにしましたが、日曜日から土曜日まで全て同じ色(黒)で表示されます。 //曜日を取得 WD = fscommand2("GetDateWeekday"); //曜日の表示文字 if(WD == 0) {WD = "SUN";} else if (WD == 1) {WD = "MON";} else if (WD == 2) {WD = "TUE";} else if (WD == 3) {WD = "WED";} else if (WD == 4) {WD = "THU";} else if (WD == 5) {WD = "FRI";} else if (WD == 6) {WD = "SAT";} //(曜日)をyoubiに表示 youbi = WD ; そこで、日曜日(SUN)を赤、土曜日(SAT)を青で表示できないものかと調べたのですが、分かりませんでした。 「SUN」と「SAT」の文字の色を変えるやり方がもしありましたら、教えて頂けませんでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 配列の連結

    Array.concat についての質問です arrA = new Array("Sun", "Mon", "Tue", "Wed"); arrB = new Array("Thu", "Fri", "Sat"); arrC = new Array(); arrC = arrA.concat(arrB); arrA = arrC; と書くことはできますが、 arrA = arrA.concat(arrB); と書くことはできないのでしょうか? やりたいことは、arrA に連結した結果を保持しておきたいのです

  • javaScriptのエラー

    サイトにjavaScriptを使って自動日付表示があったのでアップしたところ年代が2004では無く104と表示してしまいます。ちなみにスクリプトは下記の通りですよろしく御願します。 <略> myWeek = new Array("Sun.", "Mon.", "Tue.", "Wed.", "Thu.", "Fri.", "Sat."); myD = new Date(); myYear = (myD.getYear() <= 99) ? 1900+myD.getYear() : myD.getYear(); myMonth = myD.getMonth() + 1; myDate = myYear + "/" + myMonth + "/" + myD.getDate(); myDay = myWeek[myD.getDay()]; document.write(myDate, " ", myDay); <略>

    • ベストアンサー
    • Mac

専門家に質問してみよう