• 締切済み

csvデータをひとつのテーブルに読み込みたい

Perlを勉強し始めた初心者です。 Perlでスケジュール管理ができるものを作っています。 月ごとのカレンダーではなく、1日単位で画面が切り替わるようにしています。 9:00~21:30までの時間を30分ごとに区切ったタイムテーブルに、 csvに保存している予定データを表示させたいのですが、うまくいきません。 かなり省略していますが、下記のようなソースです。 ************************************************************************ for($i=9; $i<=21; $i++) #時間の数だけテーブルをループさせます。 { open(IN,"data.csv"); while (<IN>) { #ここにテーブルタグを書き、csvの予定データを読み込みます。 } close(IN); } ************************************************************************ 上のようにすると、csvファイルにある予定データの数だけテーブルを 繰り返してしまいます。もし予定データが5件あるとしたら、9:00の行が5つ、 9:30の行が5つ、と作成されてしまいます。 テーブルを重複させずにcsvのデータを表示させるにはどうしたら良いのでしょうか? 根本的な考え方が間違っているのでしょうか? わかりにくい質問になってしまいましたが、アドバイス頂ければ嬉しく思います。

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

すいません。書かれている意味が分かりません。 for($i=9; $i<=21; $i++) と書かれていますが、 9時から21時まで、30分毎にくぎるなら、26回分必要なので for($i=9; $i<=21; $i++)とするなら、 ひとつの$iで0分台と30分台の2つ分を処理すべきかと思います。 for ($i=2*9;$i <= 21*2; $i++)とすれば26回分のループが作れます。 >もし予定データが5件あるとしたら、9:00の行が5つ、 >9:30の行が5つ、と作成されてしまいます。 予定データが5件の意味が分かりません。 Aさん、Bさん、Cさん、Dさん、Eさんの分で5件なのですか。 それとも、9:00、9:30、10:00、10:30、11:00 の分で5件なのですか。 前者なら、26回のループで各担当者分の予定を記述しているため、それで問題ないと考えます。 後者なら、while(<>)を1回だけ実行し、9:00から順番に割り当てればよいと考えます。

  • TagoSuck
  • ベストアンサー率72% (16/22)
回答No.1

CSVのデータ内容と、テーブルタグの出力内容がわからないので、なんともいえませんが、9時から21時までの間の13回ファイルをオープンして全てのデータを読み込み、出力し、閉じていますので、そのようになるのかと。 例えば、配列とかハッシュにCSVの内容を持っておいて、日付と時間で検索を行って、それを出力するとかの処理が必要ではないでしょうか? ファイルが日時別に管理されているなら別ですが、その場合には、オープンするファイル名が定数にはなりませんね。

関連するQ&A