WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:2ヶ月間だけデータを表示

0:[投稿] ゆう。 [2002/03/19 02:50 ][環境:WIN+NN WIN系+Perl]

いつもお世話になっております。

今、作っているものは、今日の日付を取得しその月から2ヶ月分
のデータを表示するというものです。
例えば、今日は3月19日ですが、それですと、2ヶ月分なので、
3月1日から4月30日まで表示できればいいのです。
しかし3月1日から3月18日までは、もう過ぎてしまっているので、
その部分は灰色で表示したいのです。

3月19日から4月30日までの色表示のために、データファイルが
存在しています。その為、そのデータファイルの中身の
日にちと比較しながら、色を表示していきたいと思っています。

以上の説明では、理解しがたい部分ばかりだと思いますが、見た目では
http://ww-fu.magma.ne.jp/~kurodai/list.html
のようにしたいのです。灰色の部分はもう過ぎてしまった日です。
赤色の部分はデータファイルの中の色によってランダムな色になります。今は全て赤にしていますが。

データファイルの中身は、今日の日付(3月19日)からのデータが
60日分入っています。
dat.txtの中身
19,3,2002,ffff00,ffff00,ffff00
20,3,2002,ffff00,ffff00,ffff00
   ・ 
   ・
   ・
16,5,2002,ffff00,ffff00,ffff00
17,5,2002,ffff00,ffff00,ffff00
こういった形で。

一応試してはいるんですけど、なぜか3月の19日までしか表示されずに、そこで止まってしまいます。

print "<table border=0>\n";
print "<tr>\n";
print "<td>\n";

open(ROOM,"data.txt");
foreach(<ROOM>){
 ($t_day,$t_month,$t_year,$t_single,$t_twin,$t_dtwin)= split(/,/);
 push(@month,$t_month);
 push(@single,$t_single);
 push(@twin,$t_twin);
 push(@dtwin,$t_dtwin);
}
close(ROOM);

my $i;
my @weeks = qw(Sun Mon Tue Wed Thu Fri Sat);
my $temptime = $^T + $i * 24 * 60 * 60;
my @times = localtime($temptime);
my $day = $times[3];
$key = $times[4];

print "$monthes[$key]<br>\n";
print "<br>\n";
print "<table border=1>\n";
print "<tr>\n";
print "<td>Date</td>\n";
my $i;
my @weeks = qw(Sun Mon Tue Wed Thu Fri Sat);
my $temptime = $^T + $i * 24 * 60 * 60;
my @times = localtime($temptime);
my $day = $times[3];

#ここから下の4行で灰色の部分の日にちを埋めています。
 if($day ne '1'){
   for($k = 1; $k < $day; $k++){
     print "<td align=center>$k</td>\n";
   }
 }
 my $i = -1;
 my @weeks = qw(Sun Mon Tue Wed Thu Fri Sat);
 do{
   $i++;
   my $temptime = $^T + $i * 24 * 60 * 60;
   my @times = localtime($temptime);
   my $day = $times[3];
   my $mon = $times[4] + 1;
   my $week = $weeks[$times[6]];
   print "<td align=center>$day</td>\n";
 } while($key >= $month[$i]);
print "</tr><tr>\n";
print "<td>SINGLE</td>\n";
my $i;
my @weeks = qw(Sun Mon Tue Wed Thu Fri Sat);
my $temptime = $^T + $i * 24 * 60 * 60;
my @times = localtime($temptime);
my $day = $times[3];

if($day ne '1'){
 for($k = 1; $k < $day; $k++){
   print "<td bgcolor=#999999><font color=#999999>■</font></td>\n";
 }
}
$i = 0;
do{
 $i++;
 $roomcolor = single[$i];
 print "<td bgcolor=$roomcolor><font color=$roomcolor>■</font></td>\n";
}while($month[$i] < $key);
print "</tr>\n";
print "</table>\n";

ダブルとDダブルの部分は省略しています。

流れとしましては、まずデータを配列に格納し、その配列の中身のデータを添え字を使いながら繰り返し、日付と比較し同じだったら
表示という風にしています。
そして、$keyと$month[$i]を比較し、$month[$i]の方が大きい時
すなわち、月が変わったときにはtableタグまで全て閉じてあと
残り一か月分を表示するという感じにしたいのですが、
これが最良な方法とも言えなくて、自分の中ではこれ以外に
方法がみつかりません。

もっといい方法があると思いますので、どなたか教えてください。


1:[回答] ヨシミ [2002/03/19 12:01 ]

こんな感じ?

#!/usr/bin/perl
print "Content-type: text/html\n\n";

my @sum;
my @monthes = qw(January February March April May June July August September October November December);
my @max = qw(31 28 31 30 31 30 31 31 30 31 30 31);

open(ROOM,"data.txt");
foreach(<ROOM>){
($t_day,$t_month,$t_year,$t_single,$t_twin,$t_dtwin)= split(/,/);

$sum[$t_month]= $sum[$t_month] + 1;

push(@month,$t_month);
push(@single,$t_single);
push(@twin,$t_twin);
push(@dtwin,$t_dtwin);
}
close(ROOM);

my $i;

my $temptime = $^T + $i * 24 * 60 * 60;
my @times = localtime($temptime);
my $day = $times[3];
my $key = $times[4]; ### 変更(月-1)


$year = $times[5] +1900;

if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) { $max[2] = 29; }

$thismonth = $times[4] +1;

print '<html><head><title>' . $year . '/' . $thismonth . '/' . $day . " List</title></head>\n<body>\n";

print "<h1 style=\"display:none\">List</h1>\n";

print "<h2>$monthes[$key]</h2>\n";
print "<table>\n<tr>";

for($i=1;$i <= $max[$key];$i++) {
    print "<th>$i</th>";
}

print "</tr>\n<tr>";

for($i=1;$i <= $max[$key];$i++) {
    if ($i < $day) {
        $tdcolor= '#888888';
    } else {
        $j = $i - $day; $tdcolor= "$single[$j]";
    }
    print "<td><font color=\"$tdcolor\">*</font></td>";
}

print "</tr>\n<tr>";

for($i=1;$i <= $max[$key];$i++) {
    if ($i < $day) {
        $tdcolor= '#888888';
    } else {
        $j = $i - $day; $tdcolor= "$twin[$j]";
    }
    print "<td><font color=\"$tdcolor\">*</font></td>";
}

print "</tr>\n<tr>";


for($i=1;$i <= $max[$key];$i++) {
    if ($i < $day) {
        $tdcolor= '#888888';
    } else {
        $j = $i - $day; $tdcolor= "$dtwin[$j]";
    }
    print "<td><font color=\"$tdcolor\">*</font></td>";
}

print "</tr>\n</table>\n";


$key++;

print "<h2>$monthes[$key]</h2>\n";
print "<table>\n<tr>";

for($i=1;$i <= $max[$key];$i++) {
    print "<th>$i</th>";
}

print "</tr>\n<tr>";

for($i=1;$i <= $max[$key];$i++) {
    $j = $i + $sum[$thismonth] - 1;
    print "<td><font color=\"$single[$j]\">*</font></td>";
}

print "</tr>\n<tr>";

for($i=1;$i <= $max[$key];$i++) {
    $j = $i + $sum[$thismonth] - 1;
    print "<td><font color=\"$twin[$j]\">*</font></td>";
}

print "</tr>\n<tr>";

for($i=1;$i <= $max[$key];$i++) {
    $j = $i + $sum[$thismonth] - 1;
    print "<td><font color=\"$dtwin[$j]\">*</font></td>";
}

print "</tr>\n</table>\n";


2:[質問] ゆう。 [2002/03/20 00:52 ]

ヨシミさん。回答ありがとうございます。
ひとつわからない部分がありました。
それは、

open(ROOM,"data.txt");
foreach(<ROOM>){
 ($t_day,$t_month,$t_year,$t_single,$t_twin,$t_dtwin)= split(/,/);
 $sum[$t_month]= $sum[$t_month] + 1;  #@
 push(@month,$t_month);
 push(@single,$t_single);
 push(@twin,$t_twin);
 push(@dtwin,$t_dtwin);
}
close(ROOM);

#@の部分で配列@sumに月別に何件づつ入っているかを足していることはわかるのですが、
data.txtの中身は、3月分は11件、4月分は30件、5月分は21件でした。
しかし@sumの中身は$sum[3]は15、$sum[4]は30、$sum[5]は15でした。
そのため、

for($i=1;$i <= $max[$key];$i++) {
 $j = $i + $sum[$thismonth] - 1;  #A
 print "<td><font color=\"$single[$j]\">*</font></td>";
}

このfor文の中の#Aの部分で$jを求めていますが、
Aprilの1日目の$jは15から始まっています。
しかしMarchの31日目の$jは11で終わっています。

Aprilの1日目の$jが12から始まってくれればこのプログラムは最高なんですが、
この誤差はどこから生じているのでしょうか。

よろしくお願い致します。


3:[回答] ヨシミ [2002/03/20 10:02 ]

> data.txtの中身は、3月分は11件、4月分は30件、5月分は21件でした。
> しかし@sumの中身は$sum[3]は15、$sum[4]は30、$sum[5]は15でした。

何故そうなるのかが分かりません。
その data.txt をちょっと見てもよいですか?

$sum[3]は11、$sum[4]は30、$sum[5]は21となるはずなんですが。


4:[回答] ゆう。 [2002/03/20 14:54 ]

data.txtは
http://www-fu.magma.ne.jp/~kurodai/data.txt
に置いています。
ちょっとカンマが全角になってしまっていますが、
本当は半角です。
あと$sum[3]は11件ではなくて12件でした。


5:[回答] ヨシミ [2002/03/20 16:08 ]

上記ファイルをカンマを置換し、
>>1
で提示したスクリプトを噛ませましたが、
$sum[3]は11、$sum[4]は30、$sum[5]
となりますよ。

data.txt の改行が LF になってるとかありませんか?
もしそうならば CR+LF にしてみてください。


6:[完了] ゆう。 [2002/03/20 23:14 ]

ヨシミさん ありがとうございます。
こっちのdata.txtの中身がおかしかったみたいです。
一旦ファイルを削除して作り直したら期待通りの結果が得られました。
ヨシミさんが書いてくれたプログラムは完璧でした。
本当にありがとうございました。


7:[完了] たこすけ [2002/03/21 00:41 ]

>>1
> if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) { $max[2] = 29; }
$max[1] では?


8:[完了] ゆう。 [2002/03/23 11:18 ]

たこすけさん、返答ありがとうございます。
$max[2]だと閏年の時には3月を29日にしてしまいますね。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World