• 締切済み

Perl 比較 順不同

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

  • Perl
  • 回答数4
  • ありがとう数9

みんなの回答

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

> perlのバージョンは 5.8.8 > プログラムの文字コードは EUC-JP > ファイルの文字コードも EUC-JP 使われている文字コードが EUC-JP の場合は、次のように変更してみてください。 my $data1 = decode 'euc-jp', 'アイウエオカキクケコ'; my $data2 = decode 'euc-jp', 'カキクケコサシスセソ'; decode の第1引数は、第2引数で指定した文字列の文字コードです。decode すると、文字列はいわゆる「Perl 内部文字列」になります。なお、「Perl 内部文字列」を外側 (コンソール、ファイルなど) に出力する場合は、(やり方はいろいろあるのですが) 一例としては次のようにします。 print encode('euc-jp', $data1), "\n";

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

Perl で日本語文字列を扱うのは非常に厄介で、プログラミングしている環境を理解していることが重要です。 ・Perl のバージョン ・プログラムの文字コード ・ファイルの文字コード 以下のコード例は、Perl のバージョン 5.8.x 以降で、プログラムを UTF-8 で書いています。 use strict; use warnings; use Encode; my $data1 = decode 'utf8', 'アイウエオカキクケコ'; my $data2 = decode 'utf8', 'カキクケコサシスセソ'; $data2 =~ s/\Q$_// foreach split //, $data1; printf "%.1f%%\n", (length($data1) - length($data2)) * 100 / length($data1);

spider32
質問者

お礼

ありがとうございます。大変参考になりました。

spider32
質問者

補足

ありがとうございます。 perlのバージョンは 5.8.8 プログラムの文字コードは EUC-JP ファイルの文字コードも EUC-JP です。 ご返答いただいたプログラムを試してみます。

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

セオリーとしてはハッシュで数えるんだろうなぁ. 例えば my %count1 = (); my @distinct_chars = grep ! $count1{$_}++, split // $line1; とか.

spider32
質問者

補足

恐れ入ります。初心者の為、苦戦しています。 現在やろうとしていることは、 データが2つあり、その比較を行う作業です。 エクセルでvlookupであいまい検索をしても、 一致しない箇所がデータによってマチマチなので、 perlでデータどうしの一致率で比較ができないかと思い、悪戦苦闘しています。 data1.csv と、data2.csvの、 1列目どうしを比較して、一致率の高いデータを抜き出したいのです。 data1とdata2のレコードの並び順は一致しません。 よろしくお願いします。

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

文字ごとに「その文字が何回出てくるか」を数えればいいだけじゃないか?

spider32
質問者

お礼

ありがとうございます。大変参考になりました。

spider32
質問者

補足

恐れ入ります。 その辺を詳しく知りたいのですが、どのようにしたらよいでしょうか。

関連するQ&A

  • 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
  • Excelの住所録を「あいうえお」順にならべるには?

    Excelで住所録を編集しました。 名前が順不同になっているので 「あいうえお」順にしたいのですが出来ますか? 住所録にはB列にカタカナのふりがながとC列に漢字名付いています。 よろしくお願いします。

  • perlで文字列の大きい順にソートするプログラムが書きたいのですが、サ

    perlで文字列の大きい順にソートするプログラムが書きたいのですが、サンプルになるような、(てか、どこかにありそうなプログラムだと思うのですが、なければ自分で書きますが)ものを教えてください。検索しましたが、良いのが見つかりませんでした・・・。

    • ベストアンサー
    • Perl
  • Excel 順不同数値の検索

    | A | B |   100 115   110   120   130   120   110   120 このように数値が順不同で並んでいるA列を上から検索して、 B1の値と同じ値かそれ以上になる行番号(かその値)をB2に表示させるには どのようにすればよろしいでしょうか。 (上記の場合ですと、3行目の120の値をB2に表示させたい。) 出来ればVBAは使わず関数だけで実現したいと考えています。 VLOCKUP、MATCH等々、検索関数を調べましたが出来そうで出来ません。 ご教示頂けますでしょうか。

  • Perlについて

    今Perlのプログラムを組まされているのですが、 IPアドレスなどの数字のような文字列を 数字が小さい順に並べようとしても うまく並べられません。 どうしたらうまく並べれるのですか? たとえば 134.342.444.321 134.342.444.332 134.421.453.222 を 134.421.453.222 134.342.444.321 134.342.444.332 に並べ替えたいのです。 ちなみにデータは大量にあります。 どうかよろしくお願いします。

  • Excel 順不同数値の検索 2

    | A | B |   100 101   102   101   100   101   102   103 このように数値が順不同で並んでいるA列を上から順に検索して、 一番最初にB1の値と同じ値かそれ以上になる値をB2に表示させるには どのようにすればよろしいでしょうか。 (A列にはB1と同じ値かそれ以上になる値が必ず存在するものとします。) 前回質問の結果、B2に下記のように入力したところ、 「=SMALL(A:A,COUNTIF(A:A,"<"&B1)+1)」 B2には「101」が表示される結果となりました。 (期待結果としては一番最初にB1「101」を超える2行目の「102」を表示したい) QNo.7625709 http://okwave.jp/qa/q7625709.html で質問させてもらい回答を得ましたが、 期待とは違う結果となる場合があることがわかったため、 再質問になります。  ※前回質問ではわかりづらかったため少し内容を変えています。 ご教示頂けますでしょうか。

  • マクロで数値の小さい順に並べたい。

    マクロで数値の小さい順に並べたい。 すみません、教えてください。B列に数値が順不同で記述されているのですが、その数値をA列に数値の 小さい順に並べ変えたいと思っています。それを、マクロで記述する方法を教えて頂けませんでしょうか。

  • Perlでの文字列操作について

    Perlを使用しての文字列操作について教えてください。 たとえば以下のような数字とアルファベットが順に並ぶ文字列があるとします。 11A4C555D67B114B9423C アルファベットは1文字ですが、数字は何個でも連続で並びます。 この文字列を「数字アルファベット」の部分で分割し、配列に格納したいのですが、うまくいきません。 @array=('11A','4C','555D','67B','114B','9423C') どなたか教えてください。よろしくお願いいたします。

  • Perlでの検索

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

    • ベストアンサー
    • Perl
  • perlのif文で・・・・・

    こんにちは。 お聞きしたいのですが、perlのif(A eq B)文で、crypt関数で暗号化した文字列の比較をしているのですが、画面に双方の変数をテスト表示をしてみて、AとBは一致しているにもかかわらず、このif文を飛ばしてしまいます。 暗号化した変数を使うのは初めてなんですが、何か可能性として考えられることはありますか? 自分でも考えられるチェックはしたつもりなんでが・・・

専門家に質問してみよう