Perlでの比較について

このQ&Aのポイント
  • Perlを使用して、文字列の一致を判定する方法について教えてください。
  • 文字列全一覧とテキストファイル内の文字列を比較し、完全一致、完全不一致、部分一致を判定したいです。
  • 数千個の文字列を含む文字列全一覧と数百個のテキストファイルがあります。どのテキストファイルの文字列が文字列全一覧に含まれているかを判定したいです。
回答を見る
  • ベストアンサー

perlでの比較について

perlでの比較について Perlで以下のことをしたいと考えております。 ”文字列全一覧”の中に文字列が数千個ほど並んでいます。 文字列が数百個かいてあるテキストファイルが数百個ほどあります。 その文字列のテキストファイルに書かれている文字列全てが”文字列全一覧”の中にある文字列と 完全一致しているか、完全不一致している、部分一致しているか仕分けたいです。 【文字列全一覧】 ABC XYZ AAA ccc DADA ABCDEFG 【文字列ファイル1】 AAA bbbb xyz SSSSSS 【文字列ファイル2】 AAA ccc DADA 【文字列ファイル3】 ABCDGHJ XYZ AAA ABC 【文字列ファイル4】 ZZZZZZ llllll 5678901 KIKIKIKI 【文字列ファイル・・・】 ・・・・・ ・・・・・ このような感じでファイルがあります。(ちなみに上記の場合、”文字列ファイル2”が完全一致で”文字列ファイル4”が完全不一致、”文字列ファイル1”と”文字列ファイル3”が部分一致になります。) どなたか教えていただけないでしょうか(涙)

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

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

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

perl xxxxx.pl *.txt 以下のプログラムは、文字列一覧ファイルをスクリプト内で、テキストファイルを上記のように引数として与えるように書いてあります。 use strict; my %check; open IN, "xxxxx.dat" or die "Can't open: $!"; while (my $line = <IN>) { chomp $line; $check{$line} = 1; } close IN; my ($match, $unmatch) = (0, 0); while (my $line = <>) { chomp $line; exists $check{$line} ? ++$match : ++$unmatch; if (eof) { my $judge = ($match and !$unmatch) ? "完全一致" : ($match and $unmatch) ? "部分一致" : "完全不一致"; print "$ARGV: $judge\n"; ($match, $unmatch) = (0, 0); } }

yasaiumaiumai
質問者

お礼

テキストファイルを逆に指定していました!! できました!!! ありがとうございました!!

yasaiumaiumai
質問者

補足

上記の構文ありがとうございました!!! 部分一致、完全不一致は正しく動作しましたが、完全一致のみ正しく動作しません。 ご教授いただけないでしょうか(涙)

関連するQ&A

  • perlで変数の中身を変数とみなす方法ってありますか?

    perlで、変数の中身を変数とみなし、その中身を知る方法ってありますか? 具体的に言うと、 $abc = "$xyz"; $xyz = "test"; なる状況だったとして、$abc から "test" という文字列にたどりつく 方法ってあるのでしょうか? 何をしたいのかというと、テキストファイル上に "$xyz" と書かれてたと します。そのテキストファイルを perl で解読したとき、その時点での 実行中の $xyz に何が入っているかを得たいのです。 もちろん、連想配列を使えば似たようなことができるのは知っていますが、 性質上、できればスタティック変数を使いたいのです。 そのような方法は、perl には用意されているのでしょうか?

    • ベストアンサー
    • Perl
  • Perlでのテキスト変換方法に関して

    テキストファイルをperlを使用して下記のように 変換したいと思っています。 --------------------------- 【変換前】 aaa 8000 52 ---1行目 abc 200 48 ---2行目 cbd 250 31   ---3行目 efg 98 45   ---4行目 abc 390 68   ---5行目 ddd 89 90   ---6行目 aaa 65 40   ---7行目 fed 900 66   ---8行目 efgh 99 49 ---9行目 abc 40 40 ---10行目 【変換後】 aaa 8000 52   ---1行目 cbd 250 31   ---3行目 efg 98 45   ---4行目 abc 390 68   ---5行目 ddd 89 90   ---6行目 fed 900 66   ---8行目 efgh 99 49 ---9行目 ---------------------------- やりたいことはまず行の先頭文字列(aaaやabc)が完全に一致する行が 複数あれば(2,5,10行目のabcや1,7行目のaaa)、2番目の文字列(スカラー値)の値が 小さい方の行は出力しないようにしたいと思っています。 例えば上記の場合ですと、2,5,10行目の最初の文字列はaaaで完全に一致しており、 2番目の列の値は5行目が390に対し、2行目は200、10行目は40と小さくなっているため 2行目,10行目は出力されない、というのが望んでいる動作です。 sortを使用してどうにかならないかとも、考えたのですが そこから先がどうしていいか思いつきませんでした。 何かよい方法を思い浮かぶ方がいましたら、どのようにPerlで記述すればよいのか 教えて頂けないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlについて教えてください!

    入力ファイルには AAA␣aaa␣AaAa 改行 BBB␣bAb␣BbBb 改行 CCC␣Abc␣CcCc 改行 DDD␣.... というように文字列がスペースおきに3つ記載されていて最後は改行されている文が複数行ある場合、 文の2つ目のaaa、bAb、Abc…のみを配列に格納したい場合のプログラムを教えてください。

    • ベストアンサー
    • Perl
  • perlを使用しての特定行抽出について

    何万行も書いてあるテキストファイルがあります。抽出したい文字列の一覧がテキストファイルにまとめられています(文字列は約1000個)。抽出したい文字列は一行にひとつづつ書かれています。何万行も書いてあるテキストファイルから抽出したい文字列と二つ合致したらその行を抽出したいです。ここで、注意していただきたいのが、抽出したい文字列一覧から二つの文字列にヒットした行を抽出したいです。宜しくお願い致します。 何万行も書いてあるテキストファイル aaaaa abc edi bb aert kkkkkkkkkk lllllll ddddd aaaaa anhi kkk    ・・・・・・・・ ・・・・・・・・ 抽出したい文字列一覧のテキストファイル aaaaa bbbbb ddddd iiiiiiiii eeeee ・・・・・ ・・・・・

    • ベストアンサー
    • Perl
  • Perl 比較 順不同

    恐れ入ります。 Perlのデキスト操作で、 文字列を順不同に比較して一致率をみることはできるでしょうか。 例えば、123456 654321を比較した場合、一致率は100% 162534と234651も一致率100%という感じです。 この比較をカタカナ標記の文字列で行いたいと思っています。 よろしくお願いします。

  • perlでのcsv形式のテキストファイルの変換

    perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。 【変換前】 10, abc , def , ghi ,jkl    ----1行目 10, abc , def , aaa, bbb   ----2行目 10, abc , def , ccc , ddd  ----3行目 11, abc , def , eee , fff   ----4行目 11, abc , def , aaa , ggg ----5行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 【変換後】 10, abc , def , ghi ,jkl    ----1行目 11, abc , def , eee , fff   ----4行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が 前の行の先頭3列と同じならその行は出力しない、といった 変換をしたいと思っております。 (例えば2行目ですと先頭3列は10, abc ,defになっており、  1行目の先頭3列と同じ文字列になっているためこの行は出力しない) 当方、Perl初心者で上記のようなことがPerlでできるかも よくわかっておりません。 そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら どのようにPerlで記述すればできるのか教えていただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perl5.8.3のunicode環境で日本語の置換え

    お助けください。m(__)m perl5.8.3環境で、utf-8にて書かれたperl内での日本語置換えの質問です。 テキストファイルを「abc.dat」、処理するperlファイルを「rep.cgi」とします。 abc.datを読み込み、ファイル内の文字列「abc」を「あいう」に置換えする部分を「$rep =~ s/abc/あいう/;」とすると、置換えはうまくいっているようなのですが、abc.datに書かれた置換え以降の日本語が文字化けします。 原因はいったいどこにあるのでしょう?? 【テキストファイル abc.dat】文字コードUTF-8、改行コードLF <div> <p>abc</p> <p>あいう</p> </div> 【perlファイル rep.cgi】文字コードUTF-8、改行コードLF use utf8; use Encode; open(TMPL,"<:encoding(utf8)","abc.dat") || die('Error'); while (<TMPL>) { $rep .= $_; } close(TMPL) || die('Error'); $str = 'あいう'; $rep =~ s/abc/$str/; print $rep; 【結果】 <div> <p>あいう</p> <p>あいう</p> </div>

    • ベストアンサー
    • Perl
  • Perlでのテキスト処理について

    Perlでのテキスト処理について質問です。 テキストファイルの中身が下記のようになっています。 【テキスト編集前】 --------------------------------------- test ,abc ,AB ,VI ,SS ,ma ---1行目 test ,abc ,AC ,PI ,VS ,ma ---2行目 test ,abc ,BA ,SS ,VS ,ma ---3行目 test ,abc ,BA ,VI ,VS ,ma ---4行目 test ,cde ,AA ,VI ,SS ,mb ---5行目 test ,cde ,CC ,PE ,VS ,mb ---6行目 test ,cde ,BC ,PI ,SS ,mb ---7行目 test ,cde ,AC ,PI ,SS ,mc ---8行目 --------------------------------------- 2列目(abc/cde)と6列目(ma/mb/mc)が同じ行に対しては 1行にまとめて出力したいと思っています。 この時、1列目、4列目、5列目はマージした形にし (同一文字は一度だけ出力、同一でない文字は/区切りで出力)、 2列目、6列目は同一文字をそのまま出力し、 3列目に関しては、該当する行の先頭行の文字列を 出力したいと思っています。 下記が当方の希望しているPerl実行後の出力結果です。 【テキスト編集後】 --------------------------------------- test ,abc ,AB ,VI/PI/SS ,SS/VS ,ma test ,cde ,AA ,VI/PE/PI ,SS/VS ,mb test ,cde ,AC ,PI ,SS ,mc --------------------------------------- このような編集をPerlで実行したいと思っているのですが、 どのような記述をすれば実行できるのか教えて頂けないでしょうか。 当方、Perlを始めたばかりで基本的なことを 伺っているのかもしれませんが すみませんが、ご了承ください。 宜しくお願いいたします。

  • Perlでの検索

    はじめまして。 Perlにて、テキストから "xxxx ∧ xxx ∨ xxx" という形の文字列を検索しようと思っており、 whileやifなどで while(またはif)($hoge =~ /xxxx ∧/g){... という検索をしても文字列一致しません。 どうやら∧や∨という記号の文字を認識していない ようなのですが、どのように解決すればよいのでしょうか? もしかしたらJ-Codeなどを使って、文字コードを 変えなければならなかったりするのでしょうか? お返事お待ちしております。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perl言語でファイル入出力プログラムについて

    Perlでファイル入出力のプログラムをコーディングしたいのですが、いまいちハッシュが理解しずらく困っています。わかる方よろしくお願いします。 moto.pl の中にあらかじめ AAA aaa AaAa AAaa BBB bbb BbBb BBbb CCC ccc CcCc CCcc AAA aaa AaAa AAaa .... というように一行ずつ文字列があり、この場合では最初の大文字AAAが二つあるので、その結果を例えばsaki.plに AAA 2 ... というように出力するプログラムを教えて頂けませんか?

    • ベストアンサー
    • Perl