項目分けデータの抽出方法

このQ&Aのポイント
  • プログラム初心者の方が項目分けされたデータから特定の項目を抽出する方法について教えてください。
  • 項目分けされたデータから特定の項目を抽出する方法を教えてください。現在は改行されている項目の内容を抽出することができません。
  • Perlを始めて1週間の初心者です。項目分けされたデータから特定の項目を抽出する方法を教えてください。
回答を見る
  • ベストアンサー

項目分けされたデータの抽出方法

プログラム初心者です。 よろしくお願いします。 下記のように項目分けされたデータがあります。 -- 【項目1】あいうえお 【項目2】かきくけこ 【項目3】さしすせそ 【項目4】 123456789 【項目5】 987654321 A 012345678 B 【項目6】たちつてと 【項目7】なにぬねの -- このデータの中から【項目2】、【項目4】、【項目5】データを抽出したいのですが、うまくいきません。 つまり、下記のように抽出したいのです。 -- 【項目2】かきくけこ 【項目4】 123456789 【項目5】 987654321 A 012345678 B -- 現在は、 while(<STDIN>)でファイルを行ごとに読み込みまして if(/【項目2】/){ print ; } if(/【項目4】/){ print ; } if(/【項目5】/){ print ; } としているのですが、これでは改行されいる項目4と項目5の内容部分が抽出できません。 このデータも取り出すためには、どのようにすれば良いのでしょうか? PERLを始めて1週間でして、簡単なことかもしれませんが、ご教授ください。 よろしくお願いします。

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

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

なるほど、項目名で抽出する必要があったのですね。 でしたら配列の変わりにハッシュを利用すると良さそうです。 %data = (); $key = ""; while (<STDIN>) {   if (/^(【項目.+?】)/) { $data{$key=$1} = $_ }   else { $data{$key} .= $_ } } このようにすると、print $data{"【項目4】"} のように使うことができます。 ※この例では項目名をそのままハッシュのキーにしましたが、項目番号だけを取り出してキーにしても構いません。 ※else 部で最後の要素にデータを連結する際、配列では $data[-1] で最後尾にアクセスできましたが、ハッシュではそのような手段がないので、最後に追加したキーを変数($key)で覚えておくようにしています。 なお、複数のファイルがあるということなので、ファイルオープンなども含めて関数化してしまうとよいでしょう。 sub read_item_file {   my ($file_name) = @_;   my (%data, $key);   open FH, $file_name or die "$file_name:$!";   while (<FH>) {     if (/^(【項目.+?】)/) { $data{$key=$1} = $_ }     else { $data{$key} .= $_ }   }   close FH;   return \%data; } # 利用例 my @item_list; push @item_list, read_item_file("item1.dat"); push @item_list, read_item_file("item2.dat");    : foreach my $data (@item_list) {   print $data->{"【項目4】"}, "\n"; }

shingen1115
質問者

お礼

返信が遅くなり申し訳ありません。 いろいろと試してみまして、ハッシュを使った方法が一番うまくいきそうです。 ありがとうございました。

その他の回答 (1)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

1行ずつ読み込んで判断・処理するのではなく、先に読み込んで項目ごとにデータをまとめてから処理するとよいと思います。 例えばこんな感じ。 # 項目ごとにデータをまとめる配列を用意 @data = (); # 読み込みながら、項目ごとにまとめる while (<STDIN>) {   # 項目名の行なら、新しいデータとして @data に追加   if (/^【項目.+】/) { push @data, $_ }   # 違うなら、@data の最後のデータに連結   else { $data[-1] .= $_ } } これで項目1~7が $data[0]~$data[6] に入るので、 print $data[3]; とすれば 【項目4】 123456789 と表示されます。 ※スクリプトをコピーする場合は、全角スペースをタブなどに置換して下さい。

shingen1115
質問者

お礼

ありがとうございます。 配列を使うと良いのですね。参考になりました。 私の質問の仕方が悪く、大変恐縮なのですが、 ファイルは複数ありまして、データ内の項目数もファイルによって違いがあります。重なる項目もあります。 そのため、print $data[3];としてもファイルによって抽出される項目が違ってきます。 ただし、抽出する項目は、全ファイル同様です。 できましたら、【項目2】、【項目4】、【項目5】という抽出したい項目のみを配列に入れまして、全ファイルとも同様の項目で出力したいと考えています。 よろしくご教授ください。

関連するQ&A

  • データ抽出のコピーの仕方を教えてください。

    エクセル2007で表を作っています。 シートAに、1行目が項目で2行目以降データです。350行ほどあります。 シートAのそのデータにフィルタを使って、3件ほど、抽出しました。 シートBに抽出したデータと1行目の項目を列幅やセルの色などそのままコピーしたいのですが、 コピー→貼り付けだと、書式がコピーできません。 項目と抽出したデータをそのまま、まるっとコピーできないでしょうか?

  • エクセルの文字列の抽出方法について

    ★★エクセルの文字列の抽出方法について★★ 下記の「対象セルの内容」のような感じで1つのセルの中に複数行の文字列が入っているのですが、 下から3行とか4行とかを指定して文字列を抽出したいと考えています。 ■対象セルの内容 [改行] [改行] [改行] a/b/r1.php[改行] a/b/r2.php[改行] a/b/r3.php[改行] a/b/r4.php ■抽出したい値 a/b/r2.php[改行] a/b/r3.php[改行] a/b/r4.php 何かしらうまい方法はないでしょうか。 ご教授なにとぞよろしくお願いいたします。

  • EXCEL:ゼロ以外のデータを詰めて抽出する方法

    初めて投稿します。よろしくお願いいたします。 EXCEL2000を使用しています。 オートフィルタを使わずに 関数でデータを抽出する方法で悩んでいます。 下記<データ>が存在しています。 2行目がゼロ以外のものを、 別シート<抽出>に上から詰めて抽出したいのです。 <データ>   A列 B列 C列 D列 E列 1行 1  2  3  4  5  ←日付 2行 5  3  0  2  0  ←数字 <抽出>別シート   A列 B列  1行 1  5 2行 2  3 3行 4  2   ↑  ↑   日付 ゼロ以外 関数については中級レベルだと思います。 いろいろ試したのですが、関数を組み合わせてもなかなかうまくいきません。 どなたかご教授いただけないものでしょうか? よろしくお願いいたします。

  • データ抽出SQLについて

    以下の様なテーブル内容のデータがあり、抽出条件:項目Aが同一でかつ、その項目Aに対する項目Bの値がひとつでも異なっている項目Aを抽出するSQLについて教えてもらえないでしょうか。よろしく御願い致します。 <データの内容> 項目A 項目B 0001 A 0001 A 0002 A 0002 B 0003 C 0003 A 0003 A 0004 B 0004 B 0004 B 0004 B <抽出結果> 0002 0003

  • SQLでデータを抽出する方法

    テーブルAとテーブルBがあり、AとBには「項目番号」と言うフィー ルドがそれぞれある。 この時、Aの「項目番号」とBの「項目番号」が一致しないデータを 抽出したい。 例: A:番号,名称   1 ,あ   2 ,い   3 ,う B:番号   1   4   5 この場合、抽出したいデータは、  番号   2 ,い   3 ,う なのですが、どうしても、   1 ,あ   1 ,あ   2 ,い   2 ,い   2 ,い   3 ,う   3 ,う   3 ,う となってしまいます。 どうしたら良いか教えてください。 よろしくお願いします。

  • Excel 複数の項目合致するデータを抽出したい

    是非、よろしくお願いいたします。 以下の状況です。 sheet1には A、B、C、Dという4列があります。データは1000行くらいです。 sheet2には A、B、C、Eという4列があります。データは2000行くらいです。 この状況で、sheet1のD列の右に新しい列を作り、 「sheet1の(例えば)A1、B1、C1と合致する行のsheet2のE列データ」を、 sheet2のABC列範囲を検索して抽出したいのです。 項目が一つであればvlookup関数でできるものを「複数項目に合致」のため上手くいきません。 この3列のデータを結合して一つにしてみましたが、結合後のデータが16桁以上のため末尾が「0」になってしまい、正確に検索できません。 何か上記を可能にする方法はないでしょうか? よろしくお願いいたします。

  • テキストファイルから日本語部分を抽出

    英語と日本語が交ざっているテキストから日本語部分を抽出するプログラムをPerlで書きたいと思って以下のようなプログラムを組みました。 --- #!/usr/bin/perl print "Input file name: "; $ifname = <STDIN>; #print "Output file name: "; #$ofname = <STDIN>; $ofname = ">> tmp.txt"; open(INPUTFILE, $ifname); open(OUTPUTFILE, $ofname); while($c = getc(INPUTFILE)){ if('a'<= $c && $c <= 'z' || 'A'<= $c && $c <= 'Z'){ }else{ print OUTPUTFILE $c; } } close(INPUTFILE); close(OUTPUTFILE); --- これを実行したところ、日本語も英語も書き出されず、数字だけ書き出されてしまいました。 日本語部分だけを抽出するようにするにはどのようにすれば良いでしょうか。 ご教示願います。

    • ベストアンサー
    • Perl
  • データ抽出について

    エクセル初心者です。 エクセル2003を使っています。 sheet1に元データとなる表があります。 ・データセル内は数値データです。 ・行方向へは200程度 ・列方向へは1500程あります。  A   B    C    D   E     F  1日付 項目1 項目2 項目3 項目4 項目5 ・・・ 2 3 4 5 6 この元データからsheet2へ日付をキーにして行データを抽出したいのです。 抽出先のsheet2のA列に予め目的の日付データのみ1200程入っています。 最初Vlookupでやり始めたんですが無理と分かりました。 フィルタオプションで試みたのですが、「検索条件範囲」の式の書き方が 分からず困っております。 OKWaveの関連したQAを参考に試行錯誤を続けていましたが、進展がありません。 お詳しい方よりのご回答をお待ちしております。

  • エクセル データ抽出について

    (データ)    A B C 1  I あ 20 2  II い 30  3  III う 10 4  IV あ 10 5  V い 20  6  VI う 30 したい事(1) A列のうちいずれかの項目を入力すると、B列の該当値を抽出 したい事(2) (1)のB列該当値が検索一行目で抽出されたら、その値からC列の値を抽出したい 困っていること・・・B列に全く同じ名前の項目があるため、抽出すると 先に来る値が飛んできてしまう 例:IVを入れると「あ」が自動で抽出され、その「あ」でさらに「10」を抽出したいのに、先にあるC1の「20」が飛んできてしまう。 それぞれ、(1)(2)にどのような関数を入れると、抽出したい値が出てくるでしょうか?

  • 重複する項目を抽出したい

    テーブルに格納された項目A及びBが共に重複する項目のみ 抽出したいのですがSQL文が上手く書けません。 初歩的なことで大変申し訳ないのですが、有識者様ご教授願います。 以下の例ですとNo1及び2を抽出したいのですが上手く 抽出できません。  No  項目A  項目B -----+--------+------------- 1 A1111 B1111 2 A1111 B1111 3 A1111 B2222 4 A2222 B1111

専門家に質問してみよう