- ベストアンサー
連想配列の操作方法について
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] (行と列を置き換えるように配列を作成したい)
- coffeegoer
- お礼率50% (3/6)
- Perl
- 回答数4
- ありがとう数2
- みんなの回答 (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]; } } とか?
関連するQ&A
- ファイルから読み込んで配列へ
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
- 配列の並び替え
下のように5つの配列がA~E列まであって、2、3行目にデータが入っています。このときに、2行目の値が3行目の値より小さい配列で、かつ、2行目の値が小さい順に並べる。その後に、3行目より、2行目の値の方が大きい配列を3行目の値が大きい順に並べるマクロコードを教えてください。 A B C D E←列 1 1 2 3 4 5←配列番号 2 4 9 8 6 2 3 1 5 7 10 3 ↑ 行 ↓ A B C D E 1 5 4 3 2 1 2 2 6 8 9 4 3 3 10 7 5 1
- ベストアンサー
- Visual Basic
- 二つの配列から連想配列を作る方法
@Aと@Bという二つの配列があり、そこから %C = ( "$A[0]" => "$B[0]", "$A[1]" => "$B[1]", "$A[2]" => "$B[2]", ・ ・ ・ ); という連想配列を作ることは出来ますでしょうか。 @Aと@Bは変動するので%Cは自動的に作成したいのです。 宜しく願い致します。
- ベストアンサー
- Perl
- エクセルでカンマ区切り文字を各行に分解するマクロを書きたい
WindowsXP Excel2003 エクセルで以下ができるマクロを書きたいです。 B列にはカンマ区切りで文字列が入っています。 カンマ区切りの数は行によって様々です。 この表をB列のカンマ区切り文字を各行に分解したいです。 その際、A列とC列は分解前の値と同様です。 このようなマクロは書けますかね? A列 B列 C列 あ a,b,c 100 い d,e 200 う f 300 え g,h 400 ↓ A列 B列 C列 あ a 100 あ b 100 あ c 100 い d 200 い e 200 う f 300 え g 400 え h 400
- ベストアンサー
- オフィス系ソフト
- テキストファイルのデータをエクセルへコピーのやり方
よろしくお願いします。 エクセル2000を使っています。 テキストのデータで A1/B1/C1 /はスペースです。 D1/E1/F1 データの長さは全部違います。 A2/B2/C2 D2/E2/F2 A3/B3/C3 D3/E3/F3 ・ ・(続く) といったものがあります。これをエクセルで A列 B列 C列 D列 E列 1行 A1 B1 C1 D1 E1 2行 A2 B2 C2 D2 E2 ・・・ 3行 A3 B3 C3 D3 E3 (続く) ・ ・(続く) という感じで別々のセルにいれて貼り付けしたいのです。 テキストデータを別々のセルに貼り付けする方法は 過去ログで「区切り位置」というのをつかえばいいというのはわかりましたが、この場合の複数行にわたるテキストデータをエクセルの1行に貼り付けする方法がわかりません。また、データの長さが違うために「区切り位置」もうまくいきません。 良い解決法をお願いします。
- ベストアンサー
- オフィス系ソフト
- csvファイルのデータ変換について
OS:windows2000pro VB:VB6.0sp5 c:\data.csv(カンマ区切) のデータ(全6列)で 1列目,2列目,3列目,4列目,5列目,6列目 [変換前(全6列)] abc,a1,aあ b2,3c,4d5e (1行目) ccc,c3,aあ い,3c,4d5e (2行目) bbc,b2,あ b2a,c3,d5e4 (3行目) [変換後(全6列)] abc,a1,"aあ b2",3c,"4d5e" (1行目) ccc,c3,"aあ い",3c,"4d5e" (2行目) bbc,b2,"あ b2a",c3,"d5e4" (3行目) 上記の様に 3列,6列目を「"・・・"」ダブルコーテイションで 囲い(変換し)、c:\data_after.csvというファイル名で 保存する為のプログラムをご教示ください よろしくお願いいたします
- ベストアンサー
- Visual Basic
- エクセルVBAのヒントをください
エクセルのある列に、文字列が入っているとします。 たとえば、Aであったり、Cであったり、A,C,Fとカンマ区切りで複数の文字列(個数は不定) が入っていたりします。 このとき、一行に一つの文字列しか含まないように、カンマで区切られた文字列を展開し、 複数行に分けて格納したいと思っています。 たとえば、一番上の行のセルにA、二番目の行に「C,D,A」、三番目の行にB、四番目の行に 「E,A」と入っていたら、各行に一文字列のみ入るように、上からA、C、D、A、B、E、Aという行を 作りたいと思います。各セルに含まれる文字列の個数は不定で、規則性はありません。 基本的に、 (1)各セルに含まれているカンマの数を調べる (2)カンマの数だけ次の処理を繰り返す ・行挿入 ・最初のカンマの位置を調べる ・先頭からカンマまでを切り取る ・上記の値をセルに入力 ・行挿入 ・2番目のカンマの位置を調べる ・1番目のカンマの位置+1から2番目のカンマの位置まで切り取る ・上記の値をセルに入力 上記をカンマの数だけ繰り返す。 といった具合にしていくのだと思いますが、このような処理をするのに はどの程度のVBAのスキルが必要ですか? 上記のヒントや、参考になるサイト、書籍があればご教授ください。
- ベストアンサー
- Visual Basic
- 秀丸で行数を行頭に挿入したい。
秀丸の初心者です。 カンマ区切りのテキストファイルがあります。 各行の頭に、行数とカンマを挿入したいのですがどのようにすればよろしいでしょうか? a,b,c,d,e,,,, e,f,e,v,x,,,, ↓ 1,a,b,c,d,e,,,, 2,e,f,e,v,x,,,, テキストファイルをcsvに名前を変更してエクセルで開くと、カンマの数が変わっていたのでエクセルではなく秀丸で行いたいと考えています。 宜しくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- カンマを改行に変換する方法
テキストファイルの中にあるカンマ(,)を改行に変換する方法を教えてください。 具体的には次のようなCSVファイルがあります。 A,B C,D E,F これを A B C D E F と変換したいのです。 EXCELを使ってもかまいません。よろしくおねがいします。
- ベストアンサー
- オフィス系ソフト
- 日付時刻編集して保存する方法教えてください。
編集前 A年月日 B時間 C D 2010.12.24 16:30 13.8 11.9 2010.12.24 16:60 14.2 12.3 2010.12.23 15:30 15.6 13.4 2010.12.23 15:30 16.2 14.2 下に800行続きます。 編集後 A日+時間 B C 241630 138 119 241660 142 123 231530 156 134 231530 162 142 A列に日と時間を記号なしで数字のみで書き出す ABCD4列をABC3列にする。 BCの数字を10倍する 以上 このような編集は可能でしょうか? 上のカンマ区切りのテキストCSVファイルを編集するマクロというのは出来ますでしょうか。 初心者なのでそのまま使える記述を教えていただけたらとても助かります。 どうぞよろしくお願いします。<(_ _ ;)>
- ベストアンサー
- オフィス系ソフト
お礼
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++; }