• ベストアンサー

一致する項目の検出?

こんにちは。 ある値とデータの中から一致したら、その行を取り出すという基本的なところで困っています。 データは 1111,aaaa,gggg 2222,gggg,5555 tttt,hhhh,3333 . . となっています。 例えば、値Xが2番目の値ggggと一致する場合、その行の2222という値を表示する、といった風にするにはどうすればよいでしょうか。 値Xがhhhhならば、ttttを取り出したいです。 splitでデータを一行取り出すのですが、どうしても、最初の一行しか取り出せず、値Xと2番目のggggと一致する場合の行を読み取る、というところがうまくいきません。 わかりにくい説明で申し訳ありませんが、よろしくお願いします。

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

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

  • ベストアンサー
  • togino
  • ベストアンサー率75% (97/129)
回答No.1

x = "gggg"; open(IN, "input.csv); while($line = <IN>){  @cols = split(/,/, $line);  if($cols[1] eq x){   print $cols[0]."\n";  } } のように1行ずつ取り出して カンマで区切って配列に代入し 配列の2番目の値と一致したら 配列の1番目の値を表示する という感じでいかがでしょう?

nananana777
質問者

お礼

返事が遅くなり、申し訳ありません。 わかりやすい説明、ありがとうございます。 ほんと、このままな考え方でやりたいのですが、どうしてもうまくいきません。 @cols = split(/,/, $line); の@colsを表示させると、一番最終行が表示されています。 この時点でおかしいからやっぱりうまくいかないのでしょうか。 すいませんが、もしお時間があれば、よろしくお願いします。

nananana777
質問者

補足

すいません。 x=gggg の値のところで、ちょっと間違ってました。 うまく動きました。 ありがとうございました。

その他の回答 (1)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.2

1111,aaaa,gggg 2222,gggg,5555 tttt,hhhh,3333 がdata.txtというファイルに入っているとして、 $target = 2; #X番目(ここでは2)の値が $search = 'gggg';#Yだった場合(ここではgggg)に $view = 1;#Z番目(ここでは1)の値を表示 open(FILE, "< data.txt"); while(<FILE>){ chomp; @parse = split(/,/); if($parse[$target-1] eq $search){print "$parse[$view-1]\n";} } close(FILE);

nananana777
質問者

お礼

返事が遅くなり、申し訳ありません。 配列の@xx[0],[1]の部分に [$target-1],などで表現してもいいのですね。数字じゃないとだめだと思ってました。 先の方の場合と同じなのですが、今は@parseには一番最終行しか入ってないみたいです。 ちょっとしたことだと思うのに、難しいです。 ありがとうございました。

関連するQ&A

  • Excelで

    2002/1/2 鈴木 AAAA 2002/1/5 佐藤 BBBB 2002/1/12 井本 CCCC 2002/1/20 田中 DDDD 2003/3/3 佐藤 EEEE 2003/3/12 井本 FFFF 2003/3/15 鈴木 GGGG 2003/4/2 田中 HHHH 2004/2/6 井本 IIII 2004/5/12 佐藤 JJJJ といったデータから 鈴木 2003/3/15 GGGG 佐藤 2004/5/12 JJJJ 井本 2004/2/6 IIII 田中 2003/4/2 HHHH のように、その人の最も最近のデータだけを 表示したいのですが、どなたか教えてください。 宜しくお願いします。

  • 特殊なレコードの取得方法

    下記のようなテーブルがあり、 マスタの方は「*」が入っていれば、デフォルト行のような扱いをしたいのです。 ・テーブルの1のデータはマスタのAと完全マッチしているので、Aの行の値が欲しい。 ・テーブルの2のデータはマスタと完全一致はしないが、列4が「*」なのでBの行の値が欲しい。 ・テーブルの3のデータはマスタと完全一致はしないが、列3と列4が「*」なので、Cの行の値が欲しい。 現在は、マスタを別名で完全一致用(m1)、列4が「*」用(m2)、列3と列4が「*」用(m3)の3つをFrom句に記述し、 Select句にて、m1がNULLなら、m2から取得、m2もNULLならm3から取得するというやり方をとっていますが、 実際の「*」がある組み合わせがたくさんあり、それだけインラインビューを用意すると遅くなっているので、 なんとかインラインビュー1つでなんとかならないものでしょうか? テーブル ┌─┬──┬──┬─┐ │01│AAAA│X001│YY│←1 ├─┼──┼──┼─┤ │01│AAAA│X001│ZZ│←2 ├─┼──┼──┼─┤ │01│AAAA│X002│YY│←3 └─┴──┴──┴─┘ マスタ ┌─┬──┬──┬─┐ │01│AAAA│X001│YY│←A ├─┼──┼──┼─┤ │01│AAAA│X001│* │←B ├─┼──┼──┼─┤ │01│AAAA│* │* │←C └─┴──┴──┴─┘

  • Excelでの値の比較

    エクセルにおいて、sheet2のA列とB列をsheet1のA列とB列を比較して、一致した場合sheet2のD列に下記のような結果を示すようにしたいのですが、どうやってD列に関数を組めばよいのか分からないので教えてください! 【sheet1】 A列 B列 C列 1行 001 AAAA 部品1 2行 002 BBBB 部品2 3行 003 CCCC 部品3 4行 004 DDDD 部品4 5行 005 EEEE 部品5 6行 006 FFFF 部品6 7行 007 GGGG 部品7 【sheet2】 A列 B列 C列 D列←この列に関数で○か×をつける 1行 001 AAAA 部品1 ○←sheet1にあるので○ 2行 008 HHHH 部品8 ×←sheet1にないので× 3行 004 DDDD 部品4 ○ 4行 009 IIII 部品9 × 5行 005 EEEE 部品5 ○ 6行 002 BBBB 部品2 ○ 7行 010 HHHH 部品10 ×

  • 一致した行を返したい

    excel2007を使っています おしえてください    A   B   C 1   1   3 2   2   8 3   2   3 4   1   3 5   7   8 6   2   8 7   1   3 このような表がありA1の1と同じ1をA列2行目から検索 B1の3と同じ3をB列2行目から検索 どちらも値が一致した行(検索開始行から数えて何番目)をC1に返したい (この場合3と6がありますが早く一致した3を返したい) C2は4となります Cに入れる数式を是非教えてください

  • VBScript(vbs)での行の取得について

    あるテキストの中に空行をはさんで文字列がある時に"ABCD"の文字列を含む場合はABCDを含むひとまとまりだけを取得したいのですがその方法について教えてください。 [テキスト] AAAA BBBB CCCC DDDD EEEE ABCD FFFF GGGG HHHH [取得したい部分] DDDD EEEE ABCD FFFF

  • Excel 不規則な行数の列に式を挿入する方法

    列A 列B  列C   列D aaaa bbbbb cccc dddd eeee ffff gggg hhhh iiiii jjjjj kkkk lllll mmm nnnn oooo pppp qqqq rrrr Excelで上のような列Dが不規則な行数でならぶ 表で、列Bの情報(名前aaaaなど)を、列Cに引用し、 次の列B名前までの間にある列Dの情報に紐づけることで、 そのあと列Dにフィルターをかけるなどして、 列Bの情報と列Dの情報の一覧をつくりたいのですが、 列Dの行は1行から10行程度と不規則なため、 列Cを利用して簡単に=B2などの引用をすることが できません。困っています。一行ごととはちょっと 勝手が違いますね。 関数を使ってでもよいのですが、何か有効な方法は ありませんでしょうか?

  • データを抽出し、フラグを立てる

    E列に入力する関数でも、マクロでも良いので、E列にフラグを立てるようにしたいです。 複雑でうまく説明出来ていないかも知れませんが、どうぞよろしくお願いいたします。 1. C列が「C'」から始まるものがあれば、その行のセルAを見る。 2. A列に同じ数字がないか探す。あった場合、その行のセルCが何の文字から始まるかを見る。 3. そのセルCが、"A","B","D","E","F"で始まる場合、1.で最初に見たC'から始まるセルCと   同じ行のセルEに、セルCの値を入れる。 【実行前】 A列    B列    C列      D列    E列 222    AAAA   C'あああ   ABC 222    HHHH   Bととと    QWN 333    GGGG   ウウウ    DGG 111    BBBB   C'ううう    FUI 444    CCCC   C'えええ   KOL 444    KKKK   C'おおお   MYT 444    LLLL   C'おおお   REF 999    DDDD   イイイ     VGC 777    EEEE   C'ききき    XSH 777    UUUU   Fかかか   ZOL 【完成イメージ】 A列    B列    C列      D列    E列 222    AAAA   C'あああ   ABC   C'あああ 222    HHHH   Bととと    QWN 333    GGGG   ウウウ    DGG 111    BBBB   C'ううう    FUI 444    CCCC   C'えええ   KOL 444    KKKK   C'おおお   MYT 444    LLLL   C'おおお   REF 999    DDDD   イイイ     VGC 777    EEEE   C'ききき    XSH   C'ききき 777    UUUU   Fかかか   ZOL

  • Open Office 3.2 Calc である値に一致したセルを含む

    Open Office 3.2 Calc である値に一致したセルを含む行を別のシートに抜き出し一覧にする方法を教えてください。 例えば、 Sheet1 という名前のシートに 行1 1,いぬ,,5 行2 8,ねこ,a,9 行3 11,いぬ,b,d のようなデータがあるとして、 行1から順番に見ていき、列B(左から2番目)の値が いぬ という文字列の場合に、 Sheet2 という名前のシートに、 行1から順番に、そっくりそのまま参照(コピーではなく)するように値を入力し、 行1 ='Sheet1'.A1,='Sheet1.B1',='Sheet1.C1',='Sheet1.D1' 行2 ='Sheet1'.A3,='Sheet1.B3',='Sheet1.C3',='Sheet1.D3' とするということです。 例は3行ですが、実際には不規則に大量にあります。(例では奇数行に いぬ がありますが、実際はそういう規則性はありません) 数式でやろうとしましたが、規則的に連続していないものを詰めて並べるのは不可能だと思いました。 マクロでもできるのかわかりませんが、どんな関数、プロパティを使ったら出来るのかでもよいので教えてください。 私は基本的なOpen Office BasicなどOpen Officeがサポートしているスクリプト言語なら理解できます。

  • 【Excel】一致するデータの検索

    Excel2003を使用しています。 Sheet1のB列の値がSheet2のA列に入力されている値と一致したら、Sheet1のC列とD列の値をSheet2のC列とD列に表示させたく、VLOOKUP関数を使用したところ、Sheet1のB列とSheet2のA列のデータの並び方(順序)が同じではないためか、VLOOKUP関数ではできませんでした。 こういう場合、マクロで処理することは可能でしょうか?可能であれば、どのようにコードを記述すればいいでしょうか? Sheet1のデータは4行目から、Sheet2のデータは6行目から入力されています。 よろしくお願いします。

  • Excelデータ比較

    エクセルにおいて、sheet2のA列、B列、C列をsheet1のA列、B列、C列と比較して、一致した場合sheet2のD列に書かれている納入先企業名を下記のように自動入力したいのですが、どうやってsheet2のD列に関数を組めばよいのか分からないので教えてください! 【sheet1】 A列 B列 C列 D列 1行 001 AAAA 部品1 A社 2行 002 BBBB 部品2 B社 3行 003 CCCC 部品3 C社 4行 004 DDDD 部品4 D社 5行 005 EEEE 部品5 E社 6行 006 FFFF 部品6 F社 7行 007 GGGG 部品7 G社 【sheet2】 A列 B列 C列 D列←この列に取引先企業が入るようにする 1行 001 AAAA 部品1 A社←sheet1にあるのでA社と入る 2行 008 HHHH 部品8 #N/A←sheet1にないので#N/Aとなる 3行 004 DDDD 部品4 D社 4行 009 IIII 部品9 #N/A 5行 005 EEEE 部品5 E社 6行 002 BBBB 部品2 B社 7行 010 HHHH 部品10 #N/A

専門家に質問してみよう