• ベストアンサー

配列をファイルに保存する方法、取り出す方法を教えてください

(1)配列をファイルに保存する方法 (2)保存した配列をファイルから出す方法 がよく分かりません。教えていただけないでしょうか。恐れ入りますがよろしくお願いいたします。 (1) $a = "あ"; $b = "い"; $c = "う"; を(@hairetuに入れて?)ファイルに保存する方法。(ファイルにすでに保存済のデータがあった場合には、消去したいと考えております。) (2) ファイルを開き、保存されている(@hairetuを取り出し?$a 、$b 、$cに切り分け?)$a 、$b 、$c を再び"あ""い""う""として用いることができるようにする方法 ちなみに、以下のように記述してみたのですが、上手く動作しませんでした。 #####################(1)配列をファイルに保存################# #!/usr/bin/perl $file = "file.dat"; $a = "あ"; $b = "い"; $c = "う"; $d = "え"; ### $a="あ" $b="い" $c="う" を@hairetuに入れたつもりです。 @hensu = ('$a','$b','$c','$d'); ### @hairetuをファイルに保存したつもりです。 open(FILE, "+<$file"); print FILE @hensu; close(FILE); ##############(2)保存した配列をファイルから出す############### ### ファイルを開き、保存されている@hairetuを取り出したつもりです。 open(FILE, "+<$file"); @hensu = <FILE>; ### @hairetuを再び$a $b $cに切り分けようとしているのですが、これでよろしいでしょうか。 foreach $line (@hensu){ ($a,$b,$c,$d) =split(/\,/,$line); } close(FILE); ### 確認のため表示 print $a; print $b; print $c; print $d; ### これを実行すると、「あいうえ」でなく「$a$b$c$d」と表示されてしまいます。何処が間違っているのか教えていただけると幸いです。

  • CGI
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • bricks
  • ベストアンサー率69% (16/23)
回答No.2

プログラムのアルゴリズムが どうこういうのは取りあえず置いときます。 じゃあ添削していきます。 @hensu = ('$a','$b','$c','$d'); これはシングルクォーテーションで括っていますので 変数としては認識されません。 ただの「$a」「$b」「$c」「$d」という 文字列が@hensuの各要素に入っています。 変数を展開させたい場合は ダブルクォーテーションで括るか そのまま変数を記入しましょう。 (1)の print FILE @hensu; (2)の @hensu = <FILE>; これはoomiyajiさんの意図とは 異なった挙動を示しています。 oomiyajiさんは配列が(1,2,3,4)という形式で 内部に保存されていると思っているみたいですが あれはただ単に配列の要素を連続で書く場合に 便利な書き方というだけで コンマ形式で保持しているわけではありません。 $hensu[0]や$hensu[2]みたいに 要素毎に管理しています。 ですので(2)の書き方はまったく違います。 oomiyajiさんの意図する書き方は 以下のようになります。 (一部略) ###(1)配列をファイルに保存### $file = "file.dat"; $a = "あ"; $b = "い"; $c = "う"; $d = "え"; @hensu = ($a,$b,$c,$d); open(FILE, ">$file"); print FILE join(",", @hensu); close(FILE); ###(2)保存した配列をファイルから出す### open(FILE, "$file"); $hensu = <FILE>; close(FILE); ($a,$b,$c,$d) =split(/,/,$hensu); print $a; print $b; print $c; print $d; Perlの基礎について書かれた文献を 読んでみた方がよいでしょう。

oomiyaji
質問者

お礼

とても丁寧に添削していただき、大変感謝しております。私の勘違いを的確にご指摘いただき、とても勉強になりました。どうもありがとうございました。おかげさまで、大変助かりました。

その他の回答 (1)

回答No.1

@hensu = ('$a','$b','$c','$d'); ↓ @hensu = ($a,$b,$c,$d); ''と""の違いも理解してください^^; あと個人的にファイルを扱うときはin/outが明確にわかるようにしたいです open(FILE, "+<$file"); ↓ open(FILE, ">$file"); # ファイルに出力(上書モード) open(FILE, "+<$file"); ↓ open(FILE, "<$file"); # ファイル読み込み

oomiyaji
質問者

お礼

どうもありがとうございます。大変助かります。ファイルを開く時の記述の仕方についてまでアドバイスいただき、とても勉強になりました。大変感謝しております。

関連するQ&A

  • PHPの配列について

    PHPの配列についての質問です。 以下のソースを // == ソース == function hoge( $foo ) { $arrs['a'] = 'A'. $foo; $arrs['b'] = 'B'. $foo; $arrs['c'] = 'C'. $foo; $arrs['d'] = 'D'. $foo; } hoge( '3' ); hoge( '9' ); // == /ソース == 実行すると print_rは // == print_r == Array (   [a] => A3   [b] => B3   [c] => C3   [d] => D3 ) Array (   [a] => A9   [b] => B9   [c] => C9   [d] => D9 ) // == /print_r == のようになります。 これを 関数を実行するごとに (0から IDのような 配列を組むようにする) 以下のようにするには どのようにすればよいでしょうか? // == print_r == Array (   [0] => Array     (       [a] => A3       [b] => B3       [c] => C3       [d] => D3     )   [1] => Array     (       [a] => A9       [b] => B9       [c] => C9       [d] => D9     ) ) // == /print_r == 使用目的は get_contentsしたものを正規表現で取り出し 配列にする処理に使おうと思っています。

    • ベストアンサー
    • PHP
  • Spliceを使った配列移動

    以前Spliceを使った配列の移動方法を教えていただきましたが、 open( FH, $file) or die "Can't open"; @list = <FH>; close(FH); push(@list,@list[$b-1]); #配列を最後列にコピー open (OUT,"> $file"); print OUT @list; close (OUT); とさせると、最後の配列を5列目に追加したいのですが4列目に追加されてしまい、困っています。 2番目の配列を新たに5列目にこうしたいのに 1コメントA コメントB 2あいうえお かきくけこ さしすせそ 3たちつてと なにぬねの はひふへほ 4らりるれろ まみむめも 5あいうえお かきくけこ さしすせそ 4列目の配列の後ろに追加されてしまう 1コメントA コメントB 2あいうえお かきくけこ さしすせそ 3たちつてと なにぬねの はひふへほ 4らりるれろ まみむめもあいうえお かきくけこ さしすせそ このようになってしまいます。 宜しければ対処法をお願いします。

    • ベストアンサー
    • Perl
  • 2ファイルの比較

    2ファイルの比較 中身が以下のようなファイルがあります。 ---ファイルA中身--- a c c d e f f ----------------- ---ファイルB中身--- a a b b b c d e g ----------------- この2ファイルから、以下のようなファイルを作りたいです。 ---ファイルC中身--- b b g ----------------- つまり、ファイルBにはあって、ファイルAにはない行をファイルCに入れたいです。 while($line_B = <FILEB>){ while($line_A = <FILEA>){ @A = split(/,/,$line_A); if($line_B !~ /$line_A/){ print FILEC $line_B; } } seek(FILEA,0,0); } としてみたのですが、全然ダメです。理由も分かってます。 が、お手上げです。ご教授お願いします。

  • 配列をテキストファイルに書き込むことは不可能でしょうか?

    Sub Macro1() Dim No As Long No = FreeFile 文字列 = "1234" Open "D:\Test.txt" For Output As #No Print #No, 文字列 Close #No End Sub 上記のMacro1の文字列の書き込みは可能なのですが Sub Macro2() Dim No As Long Dim 配列 As Variant Range("a1").Value = "1☆2☆3☆4☆" No = FreeFile 配列 = Split(Range("A1").Value, "☆") Open "D:\Test.txt" For Output As #No Print #No, 配列 Close #No End Sub だと「Print #No, 配列」で「型が一致しません」とエラーになってしまいます。 テキストファイルに配列を書き込みたいのですがどうすればいいのでしょうか? よろしくお願い致します。

  • バッチファイルで配列を使いたい

    バッチファイルで配列を使いたいと考えていますが、可能でしょうか。 イメージとしては、 set a1=a set a2=b set a3=c set a4=d set a5=e mkdir a1からa5 とすると、 a,b,c,d,eのフォルダが作成できるような感じです。 可能でしょうか。 よろしくお願いします。

  • perlです。配列ファイルをよみこんで、1つの要素を上書きする方法

    配列のファイルがあり、それをよみこんで、1つの要素だけ上書きして保存する方法を教えてください。 ex. file.datを以下のようなファイルだとして・・・ あいうえを かきくけこ さしすせそ たちつてと file.datが、 さしすせそ となるようにしたいのです。(つまり、三番目の要素を取り出し、上書き保存するというもの) 以下のように書いてみましたがうまく動きません。 open()やclose()は一回使うだけでいいように、読み書き両用で開いてみました。 $_にはファイル名が入っています。 open(FILE,"+<$_"); @temp=<FILE>; $temp2=$temp[2]; print FILE $temp2; close(LOGFILE); +<を+>とすると、ファイルが空(何も無くなる)となります。 まず読み専用で開いて、ファイルを閉じた後。上書き用で開いたほうがいいのでしょうか??

    • ベストアンサー
    • CGI
  • ファイルから読み込んで配列へ

    PerlでCGIスクリプト(掲示板もどき)を作成しています。 配列の操作がうまくいかず、ご教授頂きたいと思います。 <やりたい事> 1.ブラウザ上のフォームからの入力を、カンマ区切りでテキストファイルに追記して保存。 2.そのテキストの一部を使ってHTMLで表を作る。 <実際の作業> 1.フォームからのデータはcgi-lib.plで連想配列として受け取り、unshiftでテキストファイルへ追記する。 &ReadParse; #フォームからデータを受け取る $o=$in{'name'}; $p=$in{'mail'}; $q=$in{'title'}; $r=$in{'comment'}; open(IN,"xxx.txt"); @tmp1=<IN>; close(IN); #1件1行として新規データを追加する unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n"); open(OUT,">xxx.txt"); print OUT @tmp1; close(OUT); 2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。 データを読み込む時点でつまづき、先に進めません。 <テキストファイルの例> 1行目:a,b,c,d 2行目:e,f,g,h 3行目:i,j,k,l 以下同様 <症状> print @tmp1;とすると、a~lの全てのデータが表示される。 $tmp1[0];とすると、(a)のみ表示される。 $tmp1[1];とすると、カンマ(,)が表示される。 $tmp1[2];とすると、(b)が表示される。 <質問> 一つの行(配列)に対して2回繰り返す処理(nameとtitle)と、行単位で繰り返す処理(1行目、2行目…)を合わせればいいのだろうと思っていますが、どうすればいいのかわかりません。 気分的には↓こんな感じです。 foreach { "行の処理" foreach { "列の処理" } } そもそも、区切り文字であるカンマが、配列に格納されている時点で失敗しているのかな?とも思っています。 宜しくお願いします。 なお、不足している情報がありましたら補足いたします。

    • ベストアンサー
    • Perl
  • 2次元配列のデータをファイルへ保存

    教えて下さい。 a(100,200)の2次元配列のデータをファイルに保存したいのですが、 a(0,0),a(0,1),a(0,2).......a(0,200) a(1,0)....... a(2,0)... . . . a(100,0)...................a(100,200) といった感じでカンマ区切りでCSV形式で保存したいのですが、これを簡単にファイルに保存する方法を 教えて下さい。 よろしくお願いします。

  • 連想配列の操作方法について

    A,B,C,D,E 1,3,4,5,7 2,4,6,7,10 4,5,1,4,8 このようなコンマ区切りテキストファイルを読み込み、次のような配列をつくるには、どうのようにしたよいか悩んでいます。 ご教授ください。 [A,1,2,4],・・・,[E,7,10,8] (行と列を置き換えるように配列を作成したい)

    • ベストアンサー
    • Perl
  • 2次元配列から1次元配列へのデータ読み込み方法をお尋ねします。

    いつもお世話になります。 readtest.csvというCSVファイルを作り、データを次のように入れています。 a,apple,301,23 b,orange,518,47 c,grape,278,19 d,banana,189,36 この3列目のデータを取り出して1次元配列に入れるため、DBtest.phpを次のように書きました。 01: <?php 02: $Data=file("../readtest.txt"); 03: for ( $i = 0; $i < sizeof( $Data ); $i++ ) { 04: $line=explode(",",$Data[$i]); 05: echo $line[2]; // 301518278189 06: // $xdata=implode(",", $line[2]); 07: } 08: ?> この実行結果は、「301518278189」となります。なぜコンマが入らないのでしょうか? 5行目をコメントアウトして6行目を生かして実行すると、 Warning: implode() [function.implode]: Bad arguments. in C:\Program Files\Apache Group\Apache2\htdocs\DBtest.php on line 6 となります。 3列目のデータを抜き出して配列を作るにはどのようにすれば良いでしょうか? よろしくご教示頂ければ幸いです。

    • ベストアンサー
    • PHP