• 締切済み

perlでアドバイスをお願いします。

あるテキストファイルが以下の内容で記述されているとします。 a   file1 a   file1 a   file1 b   file1 b   file1 b   file1 c   file2 c   file2 d   file2 d   file2 e   file2 e   file2 f   file3 f   file3 f   file3 上記のように列が二つあるテキストファイルについて、 2列目のfile名が1列目のどの値とひもづいて いるかを処理するperlプログラムを作ることを考えます。 出来上がったperlによって上記テキストファイルを処理した結果は、 file1は aとb file2は cとdとe file3は f とひもづいていることが分かる ということにしたいです。 これをperlプログラムで書くとき、条件として 一行一行を読みとるとき if ( $_ =~ /(\S+)\s+(\S+)/ ){ を使っています。 そのため$1と$2に現在行の1列目,2列目が与えられた後、 ハッシュと配列を組み合わせて考えた場合どのようにすれば いいのでしょうか。 また仮にテキストファイルの続きが存在し、 1列目がg 、2列目がfile1 の行があるとき 2列目で既に出てきた同じfile名はエラーとすることも考えた 場合どう記述するのか合わせてお願い致します。 長くなってしまい申し訳ないのですが、 ご指導ご鞭撻宜しくお願い致します。

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

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

%hash = ( file1 => ['a', 'b'], file2 => ['c', 'd', 'e'], file3 => ['f'],); ハッシュと配列の組み合わせで作るとすれば、上記のようなデータ構造になると思います。なお、遠く離れたファイル名をエラーにする場合は、現在処理中のファイル名を記憶しておく必要があります。 use strict; open FH, 'xxx.txt' or die $!; my ($ckey, %hash) = (''); while (<FH>) { if ($_ =~ /(\S+)\s+(\S+)/) { if ($ckey eq $2) { push @{$hash{$ckey}}, $1 unless grep { $1 eq $_ } @{$hash{$ckey}}; } elsif (exists $hash{$2}) { print "$2 は既に出てきたためエラーとして処理をストップしました\n"; } else { $ckey = $2; push @{$hash{$ckey}}, $1; } } } close FH; print "$_は ", join('と', @{$hash{$_}}), "\n" foreach sort keys %hash;

torajiro123
質問者

お礼

こちらからの回答が遅くなり失礼しました。 ご回答感謝致します。

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

「また」以降で何を言っているのかわかりません. その場合に, どうして「エラー」なのですか? 「既に出てきた同じfile名」というなら, 2行目で「エラー」にならないとおかしいですよ. ちなみに本題については基本的に http://okwave.jp/qa/q7913474.html で書かれているようにハッシュのハッシュでいくのが無難.

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

while(@line){ if ( $_=~/(\S+)\s+(\S+)/ ){ %check{$2}=$1; # =>じゃない } この場合keyがない場合は自動的に作られますから、すでにkeyが存在しているか否かを判断して代入しなければなりません。 unless( exists $check{$1}){}

関連するQ&A

  • perlでご助言お願い致します。

    あるテキストファイルが以下の内容で記述されているとします。 a   file1 a   file1 a   file1 b   file1 b   file1 b   file1 c   file2 c   file2 d   file2 d   file2 e   file2 e   file2 f   file3 f   file3 f   file3 上記のように列が二つあるテキストファイルについて、 2列目のfile名が1列目のどの値とひもづいて いるかを処理するperlプログラムを作ることを考えます。 出来上がったperlによって上記テキストファイルを処理した結果は、 file1は aとb file2は cとdとe file3は f とひもづいていることが分かる ということにしたいです。 これをperlプログラムで書くとき、条件として 一行一行を読みとるとき if ( $_ =~ /(\S+)\s+(\S+)/ ){ を使っています。 そのため$1と$2に現在行の1列目,2列目が与えられた後、 ハッシュと配列を組み合わせて考えた場合どのようにすれば いいのでしょうか。 ご助言ご鞭撻宜しくお願い致します。

    • ベストアンサー
    • Perl
  • perlでの、ファイル読み込みについて

    perlでの、ファイル読み込みについてお尋ねしたいことがあります。 a b c d e f g h i というような内容のテキストファイルがあったとき、この成分を「○行×列」の個別に読み込みたいのですが、 (C言語でいう、「A[0][0]=a A[0」[1]=b A[0][2]=c A[1][0]=d ・・・のように) どのようにしたらよいのでしょうか? perlに関しては全くの初心者なのですが、どうしてもperlを使わないといけない事情があり、 稚拙な質問かとは思いますが、どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • テキストファイルのデータをエクセルへコピーのやり方

    よろしくお願いします。 エクセル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行に貼り付けする方法がわかりません。また、データの長さが違うために「区切り位置」もうまくいきません。 良い解決法をお願いします。

  • perlで、後ろの行を読んで、前の行に書き込むには?

    perl初心者です。 後ろの行を読んで、戻って、指定の行に、書き込む方法が、よくわかりません。 下記のようなファイルを読み込んで ---------------------------- アルファベット= 1A 2B 3C アルファベット= 1A 2B アルファベット= 1A 2B 3C 4D 5E 6F ------------------------------ 下記のように、「アルファベット=」にアルファベットを入れるには、どうしたらいいでしょうか? ------------------------------ アルファベット=ABC 1A 2B 3C アルファベット=AB 1A 2B アルファベット=ABCDEF 1A 2B 3C 4D 5E 6F -------------------------------- よろしくお願い致します。

  • マクロを教えてください

    CSVファイルで、     A    B    C    D    E   F 1 444  あああ  123  けけけ 2 555  いいい  456  かかか 3 666  ううう  000        4 山   5 川 上記のようなCSVファイルで3行目のC列には0・D列はブランクです。 そこで3行目でD列がブランクのときは、A列をC列に、B列をD列に持ってきて あいたA列には999B列には@@@を入れたいのです。 そしてもうひとつは、A列をE列にコピーをしてF列はE列の数字以外を持ってきたいのです。 結果は   A      B    C    D   E   F 1 444  あああ  123  けけけ  444 2 555  いいい  456  かかか  555 3 999  @@@  666  ううう  999 4 山                    山 5 川                    川 といった結果のマクロを作りたいです。 どなたか教えてください。よろしくお願いします。

  • EXCELの関数について

    いつもお世話になってます。ありがとうございます。 excelの関数についてお聞きしたいことがあり質問しました。      A列 B列 C列 …        a   c   e  g  i 1行 2日 ○  △ □ ● ■ となっているデータを      A列 B列 C列 …      a   b   c  d   e  f  g  h  i … 1行 1日 2行 2日 3行 3日 こんなシートに自動的に打ち込めるようにしたいのです。      A列 B列 C列 …      a   b   c  d   e  f  g  h  i … 1行 1日 2行 2日○    △    □    ●    ■ 3行 3日 が完成図イメージです。 一番上の色々なデータから表を完成させたいのですがどうすればできるでしょうか。 vlookupやhlookupでは一行ずつの打ち直しが必要になってしまいます。 よろしくお願いします。

  • Perl テキスト内の文字列 合計値

    ご教示お願い致します。 test.txt --------------- a,a,a c,b,b b,c,b a,a,d a,e,e --------------- ↑のようなテキストがあり それを 1列目[0] a = 3 b = 1 c = 1 d = 0 e = 0 2列目[1] a = 2 b = 1 c = 1 d = 0 e = 1 3列目[2] a = 1 b = 2 c = 0 d = 1 e = 1 このように求めたいのと、 全ての配列から a = 6 b = 4 c = 2 d = 1 e = 2 という風に求めたいのですが、どのようにするのでしょうか?

  • Perlでエクセルからテキストファイル生成

    Perlを使い、エクセル表からデータを読み込みテキストファイルを生成したいと思っています。 Perlについて知識はほとんどありません。 サンプル記述等で教えていただけたら助かります。 下記のようなエクセル表があるとします。 <"PARAMETER.xls">   A    B   C +-------+------+--------+ 1| XXX | 32 | 0000 | +-------+------+--------+ 2| YYY |  8 | 000A | +-------+------+--------+ 3| ZZZ | 16 | 1000 | +-------+------+--------+ 4|    |  8 | 000A | (注)"A"列には記入が無いので無視。 +-------+------+--------+ 5| WWW | 32 | F000 | +-------+------+--------+ エクセル表を読み込み、下記の変換方法に従い テキストファイルを生成したいのです。 ●変換方法(基本構文) --------------------------------- if(DTin = "C") <--"C" 列のデータと比較します。 "A" = DTout("B-1":0); <--"A" 列の変数名に、"B-1"の値を代入します。 <-- 改行します。 --------------------------------- 変換後 生成されたファイルは下記を考えています。 ◆生成ファイル "Source.txt" ---------------------------------- if(DTin = 0000) XXX = DTout(31:0); if(DTin = 000A) YYY = DTout(7:0); if(DTin = 1000) ZZZ = DTout(15:0); if(DTin = F000) WWW = DTout(31:0); ---------------------------------- (注)4行目の"A"列には記入が無いので無視します。 以上、ざっくりとした説明で申し訳ありませんが、 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Awkで固定行ずつ行列転置

    A B C D E F G H . . . と、1列にデータが並んだテキストファイルの中身を A B C D E F G H ... のように4列ずつに区切って並べ替えるawkスクリプトを 書きたいのですが、どのように書けばいいでしょうか? もとのデータの行数は4の倍数とは限らないので、 並べ替え後の最後の行はフィールドが4つ未満になるかもしれません。

  • perlで列の抜き出し

    a,b,c,d 1,2,3,4 5,6,7,8 以上のような配列のデータを読み込んだときに、 c 3 7 のように縦の列のデータを抜き出すプログラムを考えています。 これはどのように記述すればよいでしょうか。 二次元配列はperlでは不可能と言うことであまりperlでは難しいでしょうか。

専門家に質問してみよう