• 締切済み

Perl 比較 順不同

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

みんなの回答

  • 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