• ベストアンサー

テキストファイルにてデータ管理

お世話になっております。 http://oshiete1.goo.ne.jp/qa4005498.html http://oshiete1.goo.ne.jp/qa4047511.html これまで上記ページにてDBを使わずにテキストファイルにてデータ管理するアドバイスをいただき、テキストエリアに入力したものをテキストファイルに登録することが出来ました。 こんな感じ。 01<>プログラム 01_01<>PHP 01_02<>javascript と入力したものを、テキストファイルに 01  プログラム 01_01 PHP 01_02 javascript に登録(半角数値と文字の間はスペース)。 そこで、テキストファイルに登録されたデータを修正・削除する管理画面を作っているのですが、テキストファイルからデータを呼び出し、file()を用いてデータを配列にし、for文で各データをテキストフォームに表示させるところまで出来ましたが、以下の点についてが分からず、アドバイスを頂ければと投函させていただきます。 1.修正する場合、テキストファイルのデータを配列にして各データをテキストフォームにて表示させているが、修正する場合、どのような流れになるのか?(テキストファイルのデータは改行にて登録されていますが、テキストファイルから読み込んだとき配列にしているので、適正な流れが分かりません) 2.テキストファイルのデータを配列にし、各テキストフォームに表示させた際、削除するための機能と考え、各データ毎にチェックボックスを設けていますが、配列データの任意の場所を削除したとき、再度テキストファイルに改行を含んだデータとして登録するには、どういった流れ(プログラム?関数?)になるのか? 以上、皆さんお忙しいとは思いますが、お知恵を頂戴出来れば幸いです。宜しくお願い致します!

  • PHP
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.5

<?php // データの読み込み $myData = unserialize(file('category.txt')); // 様々な処理 $fp = fopen('category.txt', 'w'); fputs(serialize($myData)); fclose($fp); ?> ですね。 出力時にserializeかけるの忘れてました。

mayu_chap
質問者

お礼

masa6272さんへ こんばんは。お世話になっております! ご丁寧に補足まで頂きありがとう御座います。 ご挨拶が遅れてしまいましたが、(自信はないものの)とりあえず動くまで設定することが出来ました! 不慣れなため、以降、似たようなことで質問することもあるかと思いますが、今後とも宜しくお願い致します。 有難う御座いました!

その他の回答 (4)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.4

serializeとオブジェクトは直接関係は無いです。 下のような感じです。 $myDataに必要なものを全部入れておきます。 例えば、 $myData['member'] = $members; // メンバーの配列 $myData['city'] = $cities; // 市の配列 $myData['prefecture'] = $prefectures; // 県の配列 のようにです。 で、入出力はまとめてですね。 <?php // データの読み込み $myData = unsirialize(file('category.txt')); // 様々な処理 $fp = fopen('category.txt', 'w'); fputs($myData); fclose($fp); ?> オブジェクト指向ですが、PHP5からかなり使えるものになっていますので、使わないのはもったいないかも。もちろん無理に使うこともありませんが。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.3

テキストファイルでの保存の話はもう済んでいるかも知れませんが・・・ テキストファイルの書式を気にせずに、serialize,unserializeを使ったらどうでしょう? serializeは、配列だろうがオブジェクトだろうが、構造や内容を保ったまま、文字列に変換します。 そして、それをそのまま、まとめてファイルに書き出します。 使うときは、一度に文字列として読み込んで、unserializeを使えば、元のデータ構造、内容が復元されます。 改行が、どうのといったことは考える必要もありません。 考えるのは、配列を使ったプログラミングだけです。 後、最初の住所録のようなものでしたら、 Prefecture、City、Memberのクラスを作って、MemberオブジェクトのプロパティにCityオブジェクトを持ち、Cityオブジェクトのプロパティとして、Prefectureオブジェクトを持つようにします。 そして、Memberオブジェクトの配列を丸のまま、serailize、unserializeでいいと思います。

mayu_chap
質問者

お礼

masa6272さんへ はじめまして、こんばんは! ご親切なアドバイスをありがとう御座います! #1-2様からのアドバイスを無駄にしたくなく、また理解を深めたいと思っておりますが、具体的な設置例なども含め、このserialize,unserializeをもう少しお教え頂けないでしょうか? アドバイスからして効率よく?(簡単?)に出来そうなイメージはあるものの、本を読んでもいまいちピンと来ないのが本音です。 これまでクラスやオブジェクトなどは、あまり取り入れずに来たもので、(ゆくゆくは学びたいとは思うものの)今回は無視して進めたいと思っているのですが、このserialize,unserializeを利用するに当たり、クラスやオブジェクトを取り入れることは不可欠なのでしょうか? もう少し具体例をアドバイスいただけると嬉しいです。 宜しくお願い致します!

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

ANo.1です まず・・file()でデータファイルを配列に読み込んだときには、各配列の文字列の最後には改行コードが付いたままなのは過去のやりとりで理解されていますね?また、ファイルへ書き込むときには、最後にPHP_EOLを付加して書き込むことは前回のやりとり(私ではなかったですが)で既知だと思います。 で、ご質問の件(配列データの取扱い)ですが、配列データと行単位で修正・POSTされた内容を書き込む場合には   $ct = 0;   $no = 0;   foreach ($array as $line) {     $ct++;     if ($ct == $_POST['no']) {       $no++;       puts($fh, $no . "\t" . $_POST[item1] . "\t" . $_POST['item2'] . PHP_EOL)       }     else {       list($wno, $body) = explode("\t", trim($line));       $no++;       puts($fh, $no . "\t" . $body . PHP_EOL);       }     } のような感じでいいのでは?$no++を2箇所に書いているのは、削除用に流用するときのためです(苦笑)。noを書き替えなくていいような場合(もしくはnoに該当するようなものがない場合)には不要ですね。削除のときはputsで修正された(POSTされた)データを書き込む代わりにcontinueで書込みをskipすればいいと思います。   $ct = 0;   $no = 0;   foreach ($array as $line) {     $ct++;     if ($ct == $_POST['no']) { continue; }     list($wno, $body) = explode("\t", trim($line));     $no++;     puts($fh, $no . "\t" . $body . PHP_EOL);     } 全部一括で書き替えるような場合には、そもそもフォームに全内容をセットするときに配列になるようにnameを工夫しますから、POSTされた内容をforeachで回せばいいと思います。 #上記では手抜きしてますが、POSTされた値の正当性やmagic_quotes_gpc関係の処理はこれより前の段階で終わっているという前提で(汗

mayu_chap
質問者

お礼

shimixさんへ おはよう御座います!お世話になっております! 早々のお返事、かつ夜遅くの対応をありがとう御座います!! 今、お教えいただいた内容を試す状況ではないので(プログラムを触れる状況じゃないので)、改めアドバイスして下さった内容を元に、試してみたいと思います!取り急ぎお礼まで・・。 ありがとう御座いました! 今日も一日頑張って下さい^^

mayu_chap
質問者

補足

shimixさんへ こんばんは。お世話になっております。 ご説明の中にある「puts」とは、「fputs」のことで宜しいでしょうか? 今回出てくる関数は、殆どと言っていいほど初めて試すものばかりで、アドバイスを頂戴してから時既に7-8時間を費やしています。。 本を片手に関数を調べながら進めているのですが、申し上げたように初めて試すものが多く、以下のように苦し紛れで動作確認をしながら進めているのが現状です。。 お恥ずかしいこととは思いますが、以下にそのソースを記載いたしますので、引続きご指導いただければ有難いです。 教えて教えて!と言うつもりじゃないのですが・・・ <?php $file_name = 'category.txt'; if(file_exists($file_name)){ $file=fopen("$file_name", "r") or die("OPENエラー $file_name"); fclose($file); $string = file($file_name); $count = count($string);//データ数 $string = file($file_name);//配列に格納 } //修正or削除 if(isset($_POST["edit-category"])){ /******** if(isset($_POST["c1"])){ $line = $_POST["c1"]; print_r($line); } $categoryname = $_POST["category_name"]; print_r($categoryname);//POSTされた配列データ $ct = 0; $no = 0; foreach($categoryname as $line){ $ct++; if ($ct == $_POST['c1']) { $no++; fputs($file_name, $no . "\t" . $_POST[category_name] . PHP_EOL); } else { list($wno, $body) = explode("\t", trim($line)); $no++; fputs($file_name, $no . "\t" . $_POST[category_name] . PHP_EOL); } } //削除 $ct = 0; $no = 0; foreach($categoryname as $line){ $ct++; if ($ct == $_POST['c1']){continue;} list($wno, $body) = explode("\t", trim($line)); $no++; puts($$file_name, $no . "\t" . $_POST[category_name] . PHP_EOL); } ******/ } //新規登録 if(isset($_POST["new-category"])){ $new = $_POST["new"]; $pattern = "<>"; $replacement ="\t";//に置換 $contents1 = ereg_replace($pattern, $replacement,$new); $pattern = "<>"; $replacement ="\t"; $new = ereg_replace($pattern, $replacement,$contents1); //$new = mb_convert_encoding($new, "SJIS","SJIS,EUC-JP,UTF-8");//Linuxサーバーの場合はSJISをEUC-JPに $file=fopen("./data/"."category.txt","w"); flock($file,LOCK_EX); fputs($file, "$new" . PHP_EOL); flock($file,LOCK_UN); fclose($file); } echo <<<EOD <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title></title> </head> <body> <form method="post" action="./"> EOD; for($i=0; $i<$count; $i++){ $category_data = $string[$i]; $category_data = explode(' ',$category_data); echo "<input type=\"checkbox\" name=\"c1[]\" value=\"".$category_data[0]." ".$category_data[1]."\"><input type=\"hidden\" value=\"".$i."\" name=\"id\">"; echo $category_data[0]; echo "&nbsp;<input type=\"text\" name=\"category_name[]\" size=\"30\" value=\"".$category_data[1]."\">\n"; echo "<br>\n"; } echo <<<EOD <input type="submit" name="edit-category" value="修正"> <hr> <textarea cols="50" rows="10" name="new"></textarea> <br> <input type="submit" name="new-category" value="登録"> </form> </body> </html> EOD; ?>

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

修正は行ごとですか?全行一括ですか?どちらにするかで処理が変わってきますが・・ ・行ごと(行番号とその行の内容を受け取る)であれば    全行を配列の読み込む。    変更のあった行を置換する    全行を再度上書きする ・全行一括であれば    受け取ったデータで全部上書きする 行削除は、上記の「行ごと」と同様で    全行の配列を読み込む    削除行番号以外のデータをデータファイルに上書きする といったパターンではないでしょうか? (蛇足) 行内のセパレータは「空白」ということですが、入力内容に空白が含まれないことは保証(空白を含んでいたら再入力にするなど)されてますか?個人的にはセパレータは"\t"(タブ)が使いやすいのですが・・

mayu_chap
質問者

お礼

shimixさんへ こんばんは!お世話になっております! 行ごとのケースと、全行のケース、どちらの方が良いのでしょうか? 色々なお考えがあるでしょうが、ご意見いただけると嬉しいです。 それと、今回アドバイスいただいた件ですが、ご説明から察すると配列を操作する内容かと思いますが、テキストファイルに上書きする際、配列から配列でないデータ(改行を含んだデータと言ったら宜しいのでしょうか・・適切な言葉が出てきません・・)にするには、どのような関数?を利用するのでしょうか?今一度アドバイス頂戴出来たら嬉しいです。 >個人的にはセパレータは"\t"(タブ)が使いやすいのですが・・ すみません。。説明が不適切だったかも知れません。。行内は以前アドバイスして下さったように、"\t"で行っています・・。

関連するQ&A

  • ファイルへデータ登録2

    こんばんは、お世話になっております。 http://oshiete1.goo.ne.jp/qa4005498.html 以前、上記ページにて同名のタイトルで質問させていただきまして、不明な点が出てきましたので、アドバイスいただければ幸いです。 ●やろうとしていること。 テキストエリア内に入力した文字列(改行あり)を、テキストファイルに登録。 テキストエリア 01<>プログラム 01_01<>PHP 01_02<>javascript 上記文字列(1行単位)を、<>の部分で分割しタブ区切りとし、テキストファイルへはイカのような形で保存。 01  プログラム 01_01 PHP 01_02 javascript 先にも述べましたが、以前投函させていただいた件を引き継いでのものですが、DBへではなくファイルへデータ保存をするというのが全く初めての試みでありまして、前回お教えいただいた、タブコード(\t)や、PHP_EOLをどのタイミングでどう設定するのか?を、少し具体的にアドバイスいただければ幸いです。 お忙しい中恐縮ですが、皆さんのお知恵をお貸し下さい。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 新規データをHTMLファイルへ書き込み

    こんばんは。お世話になっております。 以前、以下のページにて質問をさせていただきました。 http://oshiete1.goo.ne.jp/qa4103031.html http://oshiete1.goo.ne.jp/qa4085773.html 以上は、DBを使わずテキストファイルへに登録されているデータを、PEARやSmartyなどを利用せずにベースとなるhtmlを参照して、指定した場所にデータを書き込む、といった内容で質問させて頂いた次第です。 ※書き込まれたhtmlファイルのイメージは、掲示板のスレッド一覧といった感じで、10件表示としており、50件のデータがある場合は4つのファイルを別名で生成・データ書き込みをしています。 そこで、今回ご指導頂きたいのは、現在、テキストファイルに保存したデータは、プログラム実行時にfor文を用いて、以前ご指導いただいたようにhtmlファイルを生成しているのですが、データの追加があった際、その都度新規にて1からファイルを生成している(ファイルを作り直している状態)ため、データが多くなったとき、ソースの記述内容にも夜と思いますがプログラムが実行・完了するまでに時間がかかり、タイムオーバー?となってしまいます。 前置きが長くなってしまいましたが、 1.以上のような流れを考えた場合、どのようなアルゴリズム?が適切なのか? 2.タイトルにあるように、既に生成されたhtmlファイルにデータを追加する場合は、どのようなプログラムになるのか? が、ここ数週間考えては調べ・・を繰り返していますが、イメージがわかずに立ち止まっております。 少々分かりにくい説明になってしまいましたが、ご指導いただければ幸いです。お忙しい中恐縮ですが、宜しくお願い申し上げます。

    • 締切済み
    • PHP
  • textarea形式のフォームで複数行入力したテキストデータを保存すると、複数行のデータができてしまう現象を回避する方法

    「テキストファイルのデータを読み込み、html画面のフォームに表示させ、データを修正後、元のテキストファイルに書き戻す」というCGIを作成中です。 テキストファイルのデータの並びは決まっていて、例えば3番目のデータが「名前」4番目のデータが「住所」だったりします。 ここで、複数行の入力が必要なフィールドをが必要となり、"textarea"形式のフォームを設定したところ、複数行のインプットをすると、テキストファイルにも複数のデータができてしまいました。2行のデータをインプットすると、データも2行になってしまい、後のデータがずれてしまいます。 そこで「複数行のテキストデータを、改行マークをつけたまま、1行のデータとして保存し、読み込んでtextarea 形式のフォームに表示させるときは、改行されて表示する」という処理が実現できるよう、時間をかけて調べておりますが未だ判らない状態です。  ご存じの方がいらっしゃいましたら是非教えて頂きたく、宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • テキストファイルやcsvファイルで読み込んだデータを使ってjavascriptで処理する方法

    javascript初心者です。 いろいろと調べたのですが、イマイチよく分からないので質問させてください。 テキストファイルやcsvファイルを読み込んで、 javascriptで判定処理をしたいと思います。 例えば、 A地区,1 B地区,0 C地区,4 ・・・ といったデータを読み込んで、 javascriptで「0なら○地区には画像Aを表示、 それ以外なら○地区には画像Bを表示する」 という形で処理したいです。 でも、 ・どうやってファイルを読み込むのか ・読み込んだデータをどのようにして配列へ入れるのか がよく分からないです。 これらのページ 「http://q.hatena.ne.jp/1195740627」 「http://www.openspc2.org/JavaScript/Ajax/Ajax_study/chapter03/002/index.html」 のような方法を参考にすれば実現可能なのでしょうか。

  • C#でバイナリデータをテキストフォームへ表示させるには?

    C#でバイナリデータをテキストフォームへ表示させるには? C#でバイナリファイルをテキストへ変換するツールを作成しています。 バイナリデータを配列へ格納し、その配列をテキスト変換してテキストフォームへ出力させるという処理を作成したいのですが、どうすれば良いのかどうしてもわかりません。 どのようなコードをどのようにして書けばよいのか、ご教示いただけないでしょうか。 よろしくお願いします。 (ちなみにC#を始めて1週間ほどです)

  • C++でvectorにテキストファイルを読み込む

    C++でテキストファイルを読み込んで平均、標準偏差などを表示するプログラムを作っているのですが、 vectorにテキストファイルを読み込ませる方法が分からないので教えていただけないでしょうか? int型の配列に読み込ませる方法もありますが、テキストファイルのデータ数が未知数のためvectorを使いたいです。

  • [VB] 配列の内容をテキストファイル出力&テキストファイルを配列に入力

    現在ひとつプログラムを作っているのですが、流れ的に (1)テキストファイルを読み込み、その内容を配列に読みこむ (2)処理(ランキングのためのソート等) (3)配列の内容をテキストファイルに書き込む という内容にしたいです。 しかしいろいろ試してみたのですが、残念ながらうまく出力されていないのか、2度目に動かしたらエラーがでます。 ご教授お願いいたします。

  • テキストファイルと照合して・・・

    ご質問させて頂きます。 javaサーブレットで以下のような処理を行うにはどのようにしたら良いでしょうか? htmlの入力フォームがあります。そのフォームには、社員ID、部課ID、日付などの項目があります。そのデータが登録されているテキストファイルがあります。入力フォームで社員ID、部課ID、日付を入力したときに、テキストファイルのデータと照合させて、もしも一致するデータがなかった場合には、エラーメッセージを表示させる、という処理を行いたいんですがどうすればいいですか?

    • ベストアンサー
    • Java
  • テキストファイルについてのプログラム

    初めまして、VC++2005を使っているプログラム初心者です。 windowsフォームアプリケーションというテンプレートを使ってプログラムを作成したいと考えているのですが、どのようにすればよいのかわからず質問しました。ご指導していただけると嬉しいです。 まず、test.txtというテキストファイルの中に以下の内容があります。 8:00  朝食 12:00 昼食 15:00 おやつ 19:00 夕食 というデータです。 このデータをボタンをクリックするとテキストファイルを1行ずつ読んで行き、15:00という文字が出たらテキストボックスに「おやつの時間」というものを表示する方法とまたそのテキストファイルの内容全体を別のテキストボックスに表示したいのですが、どのようにすればよいのでしょうか? fscanfやfopenなどを使うのですが、どうしてもうまくいかないのでよろしくお願いします。

  • テキストボックスに表示するにはどうすれば良いですか?

    javascriptを使用して"csvファイル"からデータを読み込んで フォームのテキストボックスに表示する方法を教えてください!!

専門家に質問してみよう