• 締切済み

病院の当番表

perlを勉強中のものです。 病院のHPで使う当番表を作ろうと四苦八苦しております。 ログファイルには 名前・専門科目・受付時間 のようなものが<>区切りで20人分、20行くらいあります。 これを本日の当番ということで、 8つのプルダウンメニューで先生の名前を$name1~$name8(最大当番医8人)に割り当ててフォームから送られてくるようにしてあります。 8人分の名前が送られてきたものを ログファイルから拾って、それぞれの項目を書き出す方法がわかりません。最大8人ですので、あくまでも人数分表示させたいのです。 1人なら単純にマッチさせて表示させることは出来るのですが、複数人数となると、どういう風にやるのがスマートなのかが思いつきません。 人数分ログファイルを読み込んでマッチさせて表示、を繰り返すのは頭が悪い気がするのです。 お知恵を拝借できれば幸せです。 よろしくお願いします。

みんなの回答

  • maura
  • ベストアンサー率46% (48/104)
回答No.5

<> で区切ったプログラムを考えるより ちゃんとDBにそのデータをいれてロジックを SQLとPerlに分担されるほうがスマートです 無理やりテキスト処理で何とかしようと出来ますが その仕組みを考えるだけの時間が無駄だと思います。 たくさんのよいプログラムが www.cpan.org にありますので 参考にするといいかもしれません。

全文を見る
すると、全ての回答が全文表示されます。
  • noro6677
  • ベストアンサー率21% (34/158)
回答No.4

>perlを勉強中のものです。 >病院のHPで使う当番表を作ろうと四苦八苦しております。 素人がって事ですよね? 仮にプログラムできたところで素人がつくるプログラム デバック能力の問題・セキュリティー(個人情報やプログラムの不備による乗っ取り)に関する問題と危険です。 素直に外注に出しましょう。

全文を見る
すると、全ての回答が全文表示されます。
  • leap_day
  • ベストアンサー率60% (338/561)
回答No.3

こんにちは $log(ログファイル***.dat)には『A<>小児科<>7:00-17:00<>』のような感じで20人分書かれていて セレクトボックス8個で当番を選択 その人数分だけ『A 小児科 7:00-17:00』のように表示したい でいいのですよね? どちらかといえば『人数分ログファイルを読み込んでマッチさせて表示』の方のやり方のような気がするけど載せときますね(^^) # 当番選択部 print "<form action='***.cgi' method='post'>\n"; #ファイル名を書いてください $j=1; for(1..8){ print "<select name='name$j'>\n"; print "<option value=''>当番選択</option>\n"; $i=0; for(1..20){ @name=(**,**,**,**); # 先生の名前をリストしてください print "<option value='$name[$i]'>$name[$i]</option>\n"; $i++; } print "</select>\n"; $j++; } print "<input type='submit' value='決定'>\n"; print "</form>\n"; # 当番表示部 $log="****.dat"; # ログファイルを書いてください @data=($in{'name1'},$in{'name2'},$in{'name3'},$in{'name4'},$in{'name5'},$in{'name6'},$in{'name7'},$in{'name8'}); open(IN,"$log"); @name=<IN>; close(IN); print "<table border='1'>\n"; $i=0; for(1..8) { foreach(@name) { ($name,$bunya,$time)=split(/<>/); if($data[$i] eq "$name") { print "<tr><td>$name</td><td>$bunya</td><td>$time</td></tr>\n"; } } $i++; } print "</table>\n"; データとして残しておくのだったらサブルーチンとかでデータの書き込みをして表示部でそのファイルを読み込んでやればいいと思います

全文を見る
すると、全ての回答が全文表示されます。
  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.2

出力される順序がログファイルの順で良ければ、 while(<LOG>){  # "<氏名><専門科目><受付時間>\n"のような入力を想定  @data=/<([^>]*)>/g;  if($data[0] eq $name1 || ・・・ || $data[0] eq $name8){   print "$data[0] $data[1] $data[2]\n";  } } で充分かと思います。 出力順をname1~8の順にしたければ、やはりハッシュが便利ですね。 while(<LOG>){  @data=/<([^>]*)>/g;  $hsh{$data[0]}=[ @data[1..2] ]; } print "$name1 $hsh{$name1}->[0] $hsh{$name1}->[1]\n"; print "$name2 $hsh{$name2}->[0] $hsh{$name2}->[1]\n"; :

全文を見る
すると、全ての回答が全文表示されます。
  • tthe_mine
  • ベストアンサー率46% (19/41)
回答No.1

> 人数分ログファイルを読み込んでマッチさせて表示、を繰り返すのは頭が悪い気がするのです。 この方法ですと、ナイーブに考えると (ログファイルのデータ数 * 当番の数) 回だけ比較を行う必要がありますね。確かにスマートとはいえません。 こんなときはハッシュを使いましょう。 ログファイルのデータを名前をキーにしたハッシュに格納します。 一度そうしてしまえば、当番の先生のデータはログファイルの大きさによらず定数時間で求まります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列比較がどうしてもできません。

    いつもお世話になっております。 現在、Perlの練習を兼ねてCGIによる簡単なスクリプトを作っています。 内容としては、フォームに入力された値を、『name.log』ファイルに書いてある値(名前一覧)を参照して、『hikaku.cgi』で比較し、 一致しなければ、『hikaku.cgi』が「名前がありません」という言葉を返す、というものです。 一応、505エラー等は起きていないのですが、どうしても文字列同士の比較ができないので、投稿しました。 各ファイルはこのような内容です。 『name.log』(604) takeshi masako-nisimura teru009 ....以下、10種ほど似たような物 『hikaku.cgi』(705) #! /usr/local/bin/perl $file = 'name.log'; $sain = 0; #フォームから値を取得する部分(省略) $ck = $FORM{'namae'}; open(DB,$file); @HIKAKU2 = <DB>; close(DB); print "Content-type: text/plain\n\n"; foreach $i (@HIKAKU2) { if($i eq $ck) { $sain++; } } if ($sain != 1) { print "名前がありません"; } __END__ こちらの考えでは、name.logの中で同じ名前はないので、$sainには1しか入らず、 したがって、名前がなかった場合は「名前がありません」が表示されるはずなのですが、どうもそれがうまく動きません。 一応、$sainとフォームデータの$ckがどうなっているか、printで表示させてみたのですが、 $sainは0、$ckは入力したフォームの値がきちんと反映されていました。 初心者ですので、間違ったところが多々あると思いますが、どなたか回答いただけると幸いです。

    • ベストアンサー
    • CGI
  • CGIログファイルから1行分ずつ表示。

    ログファイルが以下のように、 NAME=***&TITLE=***&HIDUKE=***= NAME=***&TITLE=***&HIDUKE=***= NAME=***&TITLE=***&HIDUKE=***= となっています。 このログファイルの中身を表示させようとしたのですが、1番上のデータ(1番古いデータ)しか表示されません。 これを数行分(できれば最新5件、など)表示させたいのですが、どのようにすればいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • プルダウンメニュー

    過去ログをプルダウンメニューで表示してます。 例えば、ファイル1、ファイル2、とある所に、ファイル3を過去ログ として追加したような場合、ファイル1やファイル2にも、ファイル3の プルダウンメニューを増やしたいのですが、それを自動でする 方法ってどうするのでしょうか。

  • ログファイルからデータ呼び出し。

    ログファイル(例えば1.logという名前とします)の中身を呼び出し、それを現在表示されているcgiのフォーム内に 表示させるにはどのようにしたらいいのでしょうか? たとえば、クッキーみたいに <input type=text name=021118 value=***></input> とすればできるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • Excelで当番表を作成したい

    Excel2019使用 初心者です。 ネット上にある様々な回答を参考にし作成していますが、1つ問題が起きたのでご回答いただけますと幸いです。 現在、平日のみをローテーション化した当番表を作成しています。(ファイル添付) ・土日祝は月によって順番がバラバラなので手入力です。 ・祝日は別シートで「祝日」という名前で設定しています。 ・I11:J11のテーブルは「担当者表」という名前をつけています ・セルJ4~ 担当者のメンバー変更は頻繁に起こるため、毎月シート上で変更しています。 ・初日担当番号は手入力です。 ・条件付き書式で、その月に該当しない日程は表示しないように、また入力すべきセルが黄色に色がつくようにしています。 ・A4=N3-(N5-1) ・B4=A4+1 ・A5=IFS(MONTH(A4)<>$K$1,"",WORKDAY(A4-1,1,祝日)=A4,INDEX(担当者表[氏名],MOD(NETWORKDAYS($A$4-1,A4,祝日)+$N$1-$N$5,$N$6)+1),TRUE,"") 問題は、「1月と10月のみ、初日担当番号に指定した者ではなくその次の者から始まってしまう」ということです。要するに、1番(あさん)を指定しているにも関わらず、2番(いさん)から始まります。 1月と10月以外は問題なく動きます。 ズレてしまう二つの月は、月の始めが第一日曜日という共通点があり、それが理由ではないかと思うのですが…。 また、A5セルの+$N$1-$N$5,$N$6)部分が理解できていませんが、間違っていたとしても1月10月以外は正しく動くのでどうしたら良いのかが分かりません…。 ここまで読んでくださってありがとうございます。 不足している情報もあるかと存じますが、ご教示下さい。

  • ログファイルからキーワードを検出、何行目か返す。

    以前こちらでおなじような質問をして回答いただいたのですが、どうしても理解できないので再度質問させていただきます。 フォームで名前や件名などを入力してもらい、その入力データをログファイルへ入れます。 ログファイルは以下のような感じのものが何行も続いています。 NAME=hoge&TITLE=tatoeba&NAKAMI=konnnakanji&LOCALTIME=20030127094224= (LOCALTIMEだけは自動で入るようになっています。) その後で、このログファイルから任意の行を取り出したいのですが、削除されることもあるため○行目という値では意図するものが出てこない可能性もあるので、 LOCALTIMEで検索をしたいのです。 20030127094224と入れた場合、ログファイルの○行目、と判定するようなことをしたいのです。 どのようにしたらいいのかさっぱりわかりません。 よろしくお願いします。 #perlです。

    • ベストアンサー
    • CGI
  • 【PHP】 書込みされた事を知らせる為のアイコン表示

    私の理想のイメージは、abc.php ファイルの掲示板に書込み(新規・返信)されたら、zyx.php ファイルの方で その abc.php ファイルの掲示板で書込みされた事を知らせる為のマーク up.gif (アイコン)を、書き込まれた日から 24時間(1日)の間表示させたいのです。 ◆ log.txt ファイル(掲示板の書込みログ) 1,みかん君,2008/04/16 15:19:14 ・ 3,りんご君,2008/04/13 22:19:32 ・ ・ 6,ぶどう君,2008/04/11 08:19:48 ・ ・ 以下省略 【 log.txt ファイルの補助説明 】 ※ 「 , 」(カンマ)で区切りを付けてます。 ※ インデックス,名前,日付 と言う順に配列がなっています。 ※ log.txt ファイルは、上から最新順に書き込まれるようにしてあります。 ※ インデックス($no) 名前($name) 内容($date)と配列がなっています。 ◆ abc.php ファイル(掲示板ページ) $fp = fopen("log.txt","a"); flock($fp, LOCK_EX); $data = implode( "," , array($no,$name,$date."\n") ); fputs($fp,$data); flock($fp, LOCK_UN); fclose($fp); 【 log.txt ファイルの補助説明 】 ※ 掲示板での書き込み処理です。 ◆ zyx.php ファイル(up.gif (アイコン)を表示させたいページ) <? $files = file("log.txt"); $logdata = $files[0]; list($no,$name,$date) = explode( "," , $logdata); if($no != ){ } ?> ここまではやってみましたが、ここから、どのようにしたらよいのか分らないので教えて下さい? また、if で、どのように条件を定義してよいかも分りません。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 書込みされた事を知らせる為のアイコン表示について

    私の理想のイメージは、abc.php ファイルの掲示板に書込み(新規・返信)されたら、zyx.php ファイルの方で その abc.php ファイルの掲示板で書込みされた事を知らせる為のマーク up.gif (アイコン)を、書き込まれた日から 24時間(1日)の間表示させたいのです。 ◆ log.txt ファイル(掲示板の書込みログ) 1,みかん君,2008/04/16 15:19:14 ・ 3,りんご君,2008/04/13 22:19:32 ・ ・ 6,ぶどう君,2008/04/11 08:19:48 ・ ・ 以下省略 【 log.txt ファイルの補助説明 】 ※ 「 , 」(カンマ)で区切りを付けてます。 ※ インデックス,名前,日付 と言う順に配列がなっています。 ※ log.txt ファイルは、上から最新順に書き込まれるようにしてあります。 ※ インデックス($no) 名前($name) 内容($date)と配列がなっています。 ◆ abc.php ファイル(掲示板ページ) $fp = fopen("log.txt","a"); flock($fp, LOCK_EX); $data = implode( "," , array($no,$name,$date."\n") ); fputs($fp,$data); flock($fp, LOCK_UN); fclose($fp); 【 log.txt ファイルの補助説明 】 ※ 掲示板での書き込み処理です。 ◆ zyx.php ファイル(up.gif (アイコン)を表示させたいページ) <? $files = file("log.txt"); $logdata = $files[0]; list($no,$name,$date) = explode( "," , $logdata); if($no != ){ } ?> ここまではやってみましたが、ここから、どのようにしたらよいのか分らないので教えて下さい? また、if で、どのように条件を定義してよいかも分りません。宜しくお願い致します。

    • 締切済み
    • PHP
  • Samurizeテレビ番組表について

    はじめまして、よぴたと申します。 先日侍始めたばかりの初心者なのですが、思うようにいかず四苦八苦しています。 今回お聞きしたいのは番組表の表示についてです。 まず現象は以下の通りです。 ・C:\Program Files\Samurize\Output\OnTV.txtと C:\Program Files\Samurize\Output\OnTVcatch.txtが更新されない。 ・ONTVJapan.vbsの更新時間30分と設定済。 ・テストは成功するのでアドレス間違いは認められず。 初心者故、皆目検討もつきません。 どうかお分かりになられる方がいらっしゃればと思い、投稿させていただきます。 以上、よろしくお願いいたします。

  • テキスト処理の速度の速い言語

    最大80MBまで増加するテキストファイルがあります。 あるアプリケーションのログファイルです。 最大80MBまで達します。 80MBまで達したら新しいファイルが作成され、 そこにログが出力されます。 このログファイルの中身を読み取り、 ある処理をして、計算結果や、必要な箇所を別のテキストファイルに 出力するプログラムを作成しました。言語はVBScriptです。 このプログラムを10分に一度実行する必要があります。 そこで問題になってしまったのが、処理時間です。 前回の処理が終わらないまま10分が経過して 次の処理が開始されてしまうのです。 特にまずいのがデータ量の多い期末や年度末です。 そこでVBScriptよりも速くテキスト処理を行える言語を教えて下さい。 BATでもJScriptでもPerlでもCでもC++でもJavaでも何でも良いです。 教えて下さい。 よろしくお願いします。

USBケーブルで印刷できない
このQ&Aのポイント
  • モバイルWi-Fiを使わずUSBケーブルで印刷できないトラブルについて
  • Windows10環境でUSBケーブルを使用して印刷できない問題の解決方法
  • ブラザー製品DCP-J582NでUSBケーブル印刷ができない時の対処法
回答を見る