• ベストアンサー

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

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] (行と列を置き換えるように配列を作成したい)

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

  • ベストアンサー
  • okiyoshi
  • ベストアンサー率34% (11/32)
回答No.4

# # 「ユーザは最後に必ず『縦を横にしろ!』と言い出す。」とか・・ # ・・テストデータはスクリプト末尾の__END__の後に置く。 # # 入力データから項目配列ref.の配列を作成 my @ary; while(<DATA>){ print $_; # 入力データの確認出力 chomp; push @ary, [ split /,/ ] } # 縦を横にした配列を作成 my @ary2; for my $x ( 0..$#ary ){ for my $y ( 0..$#{$ary[$x]} ){ push @{$ary2[$y]}, $ary[$x][$y]; } } # 編集した配列をcsvデータに戻す・・必要なら・・ my $file2; for( @ary2 ){ $file2 .= join ',', ( @$_, "\n" ); } print "--\n"; print $file2; # 縦横変換後の確認出力 __END__ A,B,C,D,E 1,3,4,5,7 2,4,6,7,10 4,5,1,4,8 -- A,1,2,4, B,3,4,5, C,4,6,1, D,5,7,4, E,7,10,8,

coffeegoer
質問者

お礼

okiyoshi様へ ありがとうございました。お蔭様で見積もりを作成できました。 本当にありがとうございました。 縦を横にした配列を作成の後は、下記のようにさせていただきました。 # 無名配列をハッシュへ。キーは、グラフ凡例名。 undef %data_table; $h=0; for( @ary2 ){ #print "----$_<br>"; my $ref = $_; my $hkey = "$h-".$hanrei_list[$h]; $data_table{$hkey} = $ref; #無名配列をハッシュへ #$file2 .= join ',', ( @$_, "<br>\n" ); $h++; }

その他の回答 (3)

  • kapura
  • ベストアンサー率50% (48/95)
回答No.3

# 求めてるものと違うかもしれないけど 読み込んだ要素の頭にコンマをつけて欲しい配列の各要素文字列の後ろに付けていけばいいと思います。以下のコードはif文を使って最初の読み込み行のときだけ頭にコンマをつけないようにしてます。 my (@outline, $linenum); while (<DATA>) {  chomp;  my @inline = split /,/;  if ($linenum++) {   foreach (0..$#inline) {    $outline[$_] .= ',' . $inline[$_];   }  }  else {   foreach (0..$#inline) {    $outline[$_] = $inline[$_];   }  } } foreach (@outline) {  print '[', $_, ']', "\n"; } __END__ A,B,C,D,E 1,3,4,5,7 2,4,6,7,10 4,5,1,4,8

  • kapura
  • ベストアンサー率50% (48/95)
回答No.2

# No.1の回答とほとんど同じですけど 読み込んだ要素を欲しい配列の後ろから追加していくと考えればいいと思います。 my @outline; while (<DATA>) {  chomp;  my @inline = split /,/;  foreach (0..$#inline) {   push @{$outline[$_]}, $inline[$_];  } } foreach (@outline) {  print '[', join(',', @{$_}), ']', "\n"; } __END__ A,B,C,D,E 1,3,4,5,7 2,4,6,7,10 4,5,1,4,8

coffeegoer
質問者

補足

質問内容が十分でなく申し訳ありません。 whileを抜けた時、結果として A,1,2,4 B,3,4,5 ・・・ E,7,10,8 と、行列を逆にしたいのですが、どのよぷにwhileの中で、配列にデータを格納したらよろしいのでしょうか?

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

どこが連想配列なのかよくわかりませんが, 何も考えずに書くと while (<>) { chomp; push @DATA, [split(/,/)]; } for (@DATA) { for $i (0 .. ($#$_-1)) { push @{$x[$i]}, $_->[$i]; } } とか?

関連するQ&A