- ベストアンサー
連想配列の操作方法について
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] (行と列を置き換えるように配列を作成したい)
- みんなの回答 (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,
その他の回答 (3)
- kapura
- ベストアンサー率50% (48/95)
# 求めてるものと違うかもしれないけど 読み込んだ要素の頭にコンマをつけて欲しい配列の各要素文字列の後ろに付けていけばいいと思います。以下のコードは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.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
補足
質問内容が十分でなく申し訳ありません。 whileを抜けた時、結果として A,1,2,4 B,3,4,5 ・・・ E,7,10,8 と、行列を逆にしたいのですが、どのよぷにwhileの中で、配列にデータを格納したらよろしいのでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
どこが連想配列なのかよくわかりませんが, 何も考えずに書くと while (<>) { chomp; push @DATA, [split(/,/)]; } for (@DATA) { for $i (0 .. ($#$_-1)) { push @{$x[$i]}, $_->[$i]; } } とか?
お礼
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++; }