
ホームページ上の日記を作成中です。
わからないことがあったのでお助けください。
たとえば、nikki.cgiファイルの中に、
20030426Sat
という文字列が格納されている変数$valueが
存在したとします。
その変数$valueの値を使用して、CGIファイルは、
nikki.datの中から、その
20030426Satが含まれている一行を探し出そうとするという作りにしたいと思っています。
nikki.datの構成は、
一日ごとのコンテンツを改行コードで区切ることにします。
一行分の内容は、
例えば、
20030426Sat,17:32,今日はいい天気だった
というように、日付、時間、日記本文というようにしたいと思っています。
長くなりましたが、この日付の文字列をnikki.datファイルの中から見つけ出して、その一行分を抽出するには、どのような関数を使えばよいのでしょうか?
また、nikki.datファイルに日記を書き込む処理を別途させなくてはならないので、ちょっと私の考えは非効率かと思っていたりします。
日記作製の際のCGIの効率的な利用方法をご存知でしたら教えてください。
一応カレンダーは完成しています。カレンダーをクリックするとその日の日記が表示されるという仕組みです。
アドバイスをお願いします。
No.3ベストアンサー
- 回答日時:
whileを抜けた段階で@datasに該当行が配列として格納されていますよ。
くっつけたいならjoinを使いましょう。
closeした後で、
$line = join(",",@datas);
とか。
ソースを省略したのですが、このままのソースですと$valueと一致する行がない場合に最後の行が@datasに代入されてしまいますので注意してください。
一致した時に、
$match = true;
とかして、後で$matchのチェックをするといいですね。
参考になりましたら幸いです。
ありがとうございます。
もう二点尋ねさせてください。
配列に関してですが、whileの中に入っている@dates配列はループするごとに上書きされていると
考えて宜しいでしょうか?
$match=true
というのはif文の中で使うと思うのですが、
どのように使えばいいのでしょう?
$valueと一致する行がない場合、
「その日の日記はありません」
というデータを表示したいので、errorを送り返すようにしたいと思っています。
if( $datas[0] eq $value){
$match=true;
last;
}
と、上記のような具合であとは、
$matchがfalseの場合は、errorメッセージを別途作成すればよいかなと思っています。
No.5
- 回答日時:
@dates配列はループするごとに上書きされます。
処理の考え方も問題ないと思います。
&error('その日の日記はありません') if ( $match eq false );
みたいな感じでしょうか。
エラー処理はサブルーチンにしておくと何かと楽ですよ。
ファイルの内容を一度に配列に読み込む方法をよく見かけますが、メモリの効率が悪いのであまりお勧めできません。
それと、頭の中で考えてるよりも実行結果をご自身で体験した方がいいと思いますよ。
ありがとうございます。
ご指摘のとおり、色々と試しながら実行していこうと思います。一応実行しているのですが、まだすくリプティングに振り回されることが多く、頭が混乱しがちです。
今回の質問もじっくり勉強した上で考察させていただきますね。
ありがとうございました!
No.4
- 回答日時:
方法は一つではないと思いますが、私の場合は、ファイル処理を伴うなら、
1.ファイルオープン
2.読込・データ格納
3.ファイルクローズ
4.データ処理
ときちんと段階で分ける方を好みます。加工を行うならその後に、
5.ファイルオープン
6.書き込み
7.ファイルクローズ
この方がすっきりして何をその段階でやっているのか見やすいので良いかと思いますが、自分で分かるというなら形式はどちらでも良いです。
open(FL,"<nikki.dat");
@data=<FL>;
close(FL);
$i=0;
while(@data[$i]){
$datahash{"@data[$i]"}="@data[$i+1]";
$i+=2;
}
@keylist=keys %datahash;
一行おきに日付・記述というデータ構成ならこういう具合に連想配列に納めてキーリスト(日付)が取れます。日付検索を行いたいならキーリストに対してindex関数や比較(eq)処理をかけて調査します。
ありがとうございます。
参考スクリプト、じっくり読ませていただきました。
ファイル処理というのは、なかなか骨のあるというか、まだperl入門者の私には手ごたえのあるスクリプティングですね。でもその分、やりがいを感じます!
ご説明の連想配列の仕組みをじっくりと
呼んで、スクリプティングに生かそうと思います。
ご丁寧にありがとうございました!
No.2
- 回答日時:
splitを使いましょう。
$logfile="nikki.dat";
open(IN,"$logfile");
while(<in>){
chomp;
@datas = split(",");
last if( $datas[0] eq $value );
}
close(IN);
こんな感じでしょうか?
カンマで区切った要素を@datasという配列に代入しています。
@datasの配列の最初の値と$valueを比較しています。
動作未確認ですが。
ありがとうございます。
なるほど!splitを使うんですね。
ところが、この$date[0]と$valueがイコールになったときに、
該当した一行分のデータを取り出して変数に格納したいのですが、
if文のあとにどのように書けば宜しいでしょうか。
教えてくださったスクリプトだと、
該当箇所のところが見つかった段階で、そのループを抜け出してしまっているだけになり、
日記データの格納作業が抜けてしまっている?ように思います。
よろしくお願いします。
No.1
- 回答日時:
いずれにせよファイルを開いて読み出し中身を変数に入れなければなりませんね。
普通は行毎の配列変数に取り込んで処理します。この場合はその変数に対してindex関数をループで当てていき、中身に調べたい文字列がないかチェックしていけば良いでしょう。
ただしこのようなデータベース型のファイル管理をする場合には連想配列を使った方が効率が良いと思います。<日付-改行-データ-改行>という構成にして日付を独立したラベルに持つ変数としてデータを取りだし、日付をindex関数でチェックしていきます。
ありがとうございます。
まず私のとるべき方法というのは、ループ部分だけを以下に記述します。$valueには20030426Satが格納されているとします。
$logfile="nikki.dat";
open(IN,"$logfile");
while(<in>){
if(index($_,$value,)){
{last;}
}
}
と上記のような感じかなと思いましたが、
if文の中が思いつきませんでした。とりあえずindex文で日付が含まれている場所は見つかるかと思いましたが、見つかった時点でlastによりループ脱出といきたいのですが、その前に、見つかった行の文字列をすべて変数に格納する必要がありますが、それがわかりません。
データベース方のファイル管理の効率性についてですが、私も自分の方法は効率が悪いと思っています。
例えば連想配列%nikkiというのを作製して、
$nikki{$date}と書くことで、
$dairy
を取り出すということですよね?
($dateが日付で、$dairyがデータという意味です)
連想配列の意味は、このサイトで何度もお世話になったおかげで理解しているつもりですが、
今回の日記の日付とデータに関しての
管理における連想配列の用い方がもう一つ、
わからないので、もう少し詳しく教えていただけないでしょうか。
長くなってしまいましたが、どうぞよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- その他(コンピューター・テクノロジー) Power Shellコマンドで作成日時を一括シフトする方法 3 2022/10/21 12:37
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
- Visual Basic(VBA) Excelのマクロについて教えてください。 作業フォルダ内に2つのファイルがあります。 このファイル 2 2023/07/09 13:40
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バイナリファイルの一部分をカ...
-
バイナリデータの書き換え
-
fread関数の使い方がわかりませ...
-
バイト型のデータを16進表記で...
-
バイナリ出力
-
perl 特定の文字列をdatファイ...
-
C言語でのファイル読み込み
-
日本語を配列に収め、そして表...
-
VBAでテキストファイルの改行を...
-
エクセルのプロパティーでセキ...
-
エクセルvbaでdocuworksprinter...
-
カンマ区切りのCSVファイルから...
-
エクセルで複数のコメントのサ...
-
VPN経由でExcelを開くのが遅い
-
ExcelブックをGoogleスプレッド...
-
エクセルのハイパーリンクがコ...
-
同じファイル名 上書きしないフ...
-
Windows10でコマンドプロンプト...
-
フォルダの中身がカラか調べる
-
Vba初心者です。下記のコード助...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
バイナリファイルの一部分をカ...
-
バイナリファイルでOutOfMemory...
-
DXFファイルをVBで取り込み、図...
-
テキストファイルを後ろから読...
-
CSVファイルによる検索の高速化
-
Cで2次元配列にCSVファイルを...
-
日本語を配列に収め、そして表...
-
VBScriptの配列は、要素数を指...
-
配列操作について
-
RGBのバイナリデータをCImageに...
-
C++による ファイルの読み込み
-
ファイルをメモリに出力する方法
-
グレースケール画像の画素値を得る
-
VBAでテキストファイルの改行を...
-
[VBS] 16進数でバイナリファイ...
-
日本語混じりのファイルをラン...
-
VBでバイナリファイルのコピー...
-
C言語でのファイル読み込み
-
Unicodeのファイル読み込みがう...
おすすめ情報