連想配列(ハッシュ)のファイルへの書き込み方と読み込み方

このQ&Aのポイント
  • 連想配列(ハッシュ)のデータをファイルに保存する方法と、ファイルからデータを読み込む方法について困っています。
  • 連想配列(ハッシュ)をファイルに保存する際に、復元可能な形式で保存する方法を教えてください。
  • ファイルから連想配列(ハッシュ)のデータを読み込む方法についても、詳しく教えてください。
回答を見る
  • ベストアンサー

連想配列(ハッシュ)のファイルへの書き込み方

連想配列(ハッシュ)のファイルへの書き込み方と、 そのファイルからの読み込み方で困っています。 たとえば以下のような連想配列(ハッシュ)があって %colorFile = ( 'red'=>'5', 'green'=>'10', 'blue'=>'3' ); この情報をサーバーの color.dat ファイルに書き込んで保存し、 変更があったときにファイルからデータを読み込むには どのようにしたらいいのでしょうか? 連想配列(ハッシュ)のまま保存すると color.datの中身が green10blue3red5 のようになってしまい、 読み込んだときに連想配列(ハッシュ)に復元できません…。 よろしくお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

Data::Dumper とか DB に tie とか.

dgdgdgdg
質問者

お礼

Tacosan様、回答ありがとうございました! リファレンス本とにらめっこの私には少々ハードルが高かったですが、なんとか思い通りの結果を得られました。 以下、自分の覚え書きも兼ねて…。 【1】 プログラムの2行目に use Data::Dumper; を追加。 【2】 連想配列(ハッシュ)の書き方を $colorFile = {'red'=>'5','green'=>'10','blue'=>'3'}; とし、 open DATA, ">color.dat"; print DATA Dumper $colorFile; close DATA; で書き込み。 【3】 保存したファイルを open DATA, "color.dat"; @openFile = <DATA>; close DATA; で読み込み。 【4】 print "@openFile"; で【2】と同じものが出力できました。 もしかしたらおかしな部分があるかもですが、とりあえず一歩前進しました。 ありがとうございました!

関連するQ&A

  • 連想配列と別配列とのマッチング

    以下の連想配列と別にあるテキストファイルを配列にして ”マッチした商品名の全てのデータを表示したいです。 ■連想配列の形↓■ 50を超えるリンゴの種類が、以下のような 連想配列($alldata)の形であります。 $alldata = [1]=> array(5) { ["no"]=> string(1) "1" ["name"]=> string(5) "san-tugaru" ["color"]=> string(3) "red" ["price"]=> string(3) "150" ["memo"]=> string(10) "aomori" } [2]=> array(5) { ["no"]=> string(1) "2" ["name"]=> string(5) "ko-gyoku" ["color"]=> string(3) "red" ["price"]=> string(3) "250" ["memo"]=> string(10) "yamagata" } というふうに50個のリンゴのデータ続きます。 リンゴの配列情報の詳細は以下の通りです。 ※配列のKeyの番号とvalueの商品Noは同じで連想配列にしています。 商品No ["no"] 名称  ["name"] 色   ["color"] 価格  ["price"] 産地  ["memo"] +-------------------------------------------------+ ■テキストファイル(select-ringo.txt)の内容と意味■ このテキストファイルは、商品No「4、5、12、30」の リンゴを選んで表示したい場合です。 +----+ 4,1,10 5,4,13 12,2,9 30,3,15 +----+ ◇カンマで区切られた数字の意味◇ ・各行の先頭の数字は「商品No.」を選択します。 ・カンマで区切られた2番目の数字は、”色”を選択します。 たとえば、1行目であれば、 商品No 4 の全ての情報は カラー1=#ff0000 echo表示されます。 他の番号の場合は色は以下の通りです。 カラー1 =#ff0000 カラー2 =#ff6600 カラー3 =#ff0066 カラー4 =#ff3399 ・3番目の数字はフォントサイズ(px)を意味します。 +---------------------------------------------------+ テキストファイルに”商品番号のみ”を入れると以下のスクリプトで動作しますが、 カンマで区切った場合のマッチング方法に悩んでいます。 ※以前、こちらで親切な方に方法を教えていただきました↓ $selectNo = array_map(rtrim, file("select-ringo.txt")); foreach ($selectNo as $num) { if (is_numeric($num) && array_key_exists($num, $alldata)) { 表示 } } みなさん、お力をお貸しください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • AJAXでサーバーにある連想配列を取り出す

    こんにちは。PHP学習者です。 ブラウザ上でAJAXを使って、サーバーにあるPHPで作ったデータファイルを取得する方法は知っていますが、連想配列を取得することは出来ますか? 今までは連想配列をわざわざテキストファイルに書き換えてからAJAXで取得していましたが、もし直接取得する方法があれば知りたいと思いました。 詳しい方、どうかよろしくご教授ください。お願いします。

  • 連想配列で時間短縮したい

    aaa.txt 06011800, 5.3 06012100, 5 06020000, 4.5 06020300, 6.2 … bbb.txt 06011800, 5.1 06012100, 7.5 06020000, 5.1 06020300, 9.3 … という二つのファイルがあります。 以下のプログラムを用いて、 06011800, 5.3, 5.1 06012100, 5, 7.5 06020000, 4.5, 5.1 06020300, 6.2, 9.3 … といった感じでデータを作る事に成功したのですが、どうしてもループに無駄が多く、時間がかかってしまいます。 連想配列などを使えば時間が短縮出来そうなのですが、よくわかりません。 ご教示いただけないでしょうか。 以下、作成したプログラム。 $csvfile1 = $ARGV[0]; $csvfile2 = $ARGV[1]; open(DAT1, $csvfile1) || die $!; while($line=<DAT1>) { chomp($line); @dat = split(/,/,$line); open(DAT2, $csvfile2) || die $!; while($line2=<DAT2>) { chomp($line2); @dat2 = split(/,/,$line2); if($dat[0] == $dat2[0]){ print "$dat[0],$dat[1],$dat2[1]\n"; } } } close(DAT);

    • ベストアンサー
    • Perl
  • 配列を変更しファイルに書き込むとなぜか古い配列も・・・

    WEB上のCGIで、 ファイル(file.dat)から配列@lineを読み込み、 @line=(01,02,03) となっているときに、配列を操作して @newline=(01,03) とし、この @newline を open(OUT,">file.dat"); print OUT @newline; close(OUT); と処理したところ、なぜか、その中身は 01 03 01 02 03 となってしまいます。つまり、新しいデータ以外に古いデータも書き込まれるのです。 いろいろ試しました。書き込みの前後で@newlineの中身を画面に表示するなどして 確かめましたが、そこには異常はありません。 また、いろいろ変えていくと、場合によっては、ファイルの中身は 01 03 00001 01 02 03 などという訳の分からないことになってしまいます。 追加書き込みの可能性はありません。 試しに @newline の中身を空にして書き込みしてみると、 この場合は ファイルの中身も空になっています。 つまり、 @newlineの中身が有るときは、 画面上には正しく表示されるのに、ファイルに書き込まれるときには、 古いデータ(場合によっては変なデータも)も一緒に出力されていると言うことです。 こういう現象の原因として何が考えられますでしょうか? 今まで、数々のファイル操作をしてきましたが、こういったことは 初めてです。 どうかご教授下さい。

  • 連想配列で

    繰り返し処理で連想配列の数字を変更しようとしたらうまくいきません 他にやり方ありますか? <?php $data['fre1']="りんご"; $data['fre2']="バナナ"; while ($k<3) { $k++; print(htmlspecialchars($data['fre{$k}'], ENT_QUOTES)); }

    • ベストアンサー
    • PHP
  • 思うような連想配列ができない・・

    省略して説明します。 関東,東京,神奈川,千葉 中部,愛知,静岡,岐阜 関西,大阪,兵庫,京都 というCSVデータがあり これを以下のような、連想配列にしたいのですがどうすればよいのでしょうか?? Array (   [0] => Array    (      [0] => 関東      [1] => 東京      [2] => 神奈川      [3] => 千葉    )   [1] => Array    (      [0] => 中部      [1] => 愛知      [2] => 静岡      [3] => 岐阜    )   [2] => Array    (      [0] => 関西      [1] => 大阪      [2] => 兵庫      [3] => 京都    ) ) --------------------------------- CSVデータを、feofで終端まで読み込み feofで一行ずつ取得 explodeでコンマで分解まではできるのですが 上記のような、連想配列ができません・・。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • 連想配列を処理するにあたって

    お世話になっております。 連想配列について質問させて頂きます。 以下のような、キーに文字列、インデックスに数字を指定している連想配列があるとします。 Array([あいうえお] => 0 [かきくけこ] => 0 [さしすせそ] => 0 [たちつてと] => 0) この連想配列のキーを指定し、そのキーに対するインデックスの数字を別の数字に置換したく思っています。 仮に、「あいうえお」のキーを指定して、そのキーに対するインデックス「0」を「1」に変更したいのです。 array_fill()やarray_fill_keys()などの関数を調べて試してみましたができませんでした。確実にプログラムが間違っているとしか言いようがないのですが、どなたかアドバイスをお願い致します。 以下のコード中にその処理を持ってきたく思っています。 /* foreach($mystery_noun as $mystery_key => $mystery_value){ __foreach($mecab_noun as $mecab_key => $mecab_value){ ____if($mystery_key == $mecab_key){ ______ここにその質問の処理を記述する。 ____} __} } */ ある連想配列のキー(文字列)が一致した場合、そのキーに対するインデックスを0→1に変更します。 尚、$mystery_noun、$mecab_nounの連想配列全てのインデックスには、それぞれ1,0が格納されています。

    • ベストアンサー
    • PHP
  • ファイルからデータを読み込んで、配列に格納する方法

    データファイル grep.dat があり、その中は 12345 67890 ABCDE (EOF) となっています。   このファイルの中身を読み込んで、配列 P[0]の 中に("12345","67890","ABCDE") に格納したい のですが、どのように記述すればよいでしょうか。

    • ベストアンサー
    • Perl
  • 連想配列を含むヒアドキュメントの書き方

    連想配列を含むヒアドキュメントの書き方を教えてください。 以下のコードならうまく行きました。 -(1)-------------------------- $SS = $_SERVER['PHP_SELF']; $html_txt = <<<EOT ($SS) EOT; echo $html_txt; ------------------------------ これを一時的な変数を使わずに以下のようなコードで実行したいです。 -(2)-------------------------- $html_txt = <<<EOT ($_SERVER['PHP_SELF']) EOT; echo $html_txt; ------------------------------ これを実行すると # Parse error: syntax error, unexpected '"', # expecting T_STRING or T_VARIABLE or T_NUM_STRING in … というエラーが出てしまいます。 最悪、(1)でもいいと思っています。しかし(2)のようなケースでもできてもいいのではないかと思うのですが、エスケープを入れたり「$_SERVER["PHP_SELF"]」などとクォーテーションを変更したりしてもうまく行きません。 質問は以下です ・(2)のような記述はPHPでは不可能なのでしょうか? ・もし可能なら(1)の何が悪いのか、どうすればうまく行くのかを教えてください よろしくお願いします。

    • ベストアンサー
    • PHP
  • 連想配列をリターン値として返す方法

    ご協力をお願いいたします。 <私の考え>を記載しましたが、上手く動作しませんでした。 何が間違っているのか、ご指摘をお願いいたします。 質問は、2件あります。 (1)連想配列の2次元について  例えば、以下の様なデータを持っている場合、  連想配列では、どの様に定義したらよいですか?  <データ>   |*name|*tel|   |moo |012 | |aiai |235 | <私の考え>   %data;   $data[0]{"name"} = "moo";   $data[0]{"tel"} = "012";   $data[1]{"aiai"} = "moo";   $data[2]{"235"} = "012"; (2)上記の様なデータをサブルーチンの返り値として渡すには? <私の考え>   sub.pl(パッケージ)   sub data {    %data;    $data[0]{"name"} = "moo";    $data[0]{"tel"} = "012";    $data[1]{"aiai"} = "moo";    $data[2]{"235"} = "012";    return(%data);   }    main.pl(サブルーチンを呼び出しているファイル)   %data = data(); print "$data[0]->{name}\n" print "$data[0]->{tel}\n"  

    • ベストアンサー
    • Perl

専門家に質問してみよう