- 締切済み
Perl 比較 順不同
恐れ入ります。 Perlのデキスト操作で、 文字列を順不同に比較して一致率をみることはできるでしょうか。 例えば、123456 654321を比較した場合、一致率は100% 162534と234651も一致率100%という感じです。 この比較をカタカナ標記の文字列で行いたいと思っています。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kumoz
- ベストアンサー率64% (120/185)
> 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)
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);
- Tacosan
- ベストアンサー率23% (3656/15482)
セオリーとしてはハッシュで数えるんだろうなぁ. 例えば my %count1 = (); my @distinct_chars = grep ! $count1{$_}++, split // $line1; とか.
補足
恐れ入ります。初心者の為、苦戦しています。 現在やろうとしていることは、 データが2つあり、その比較を行う作業です。 エクセルでvlookupであいまい検索をしても、 一致しない箇所がデータによってマチマチなので、 perlでデータどうしの一致率で比較ができないかと思い、悪戦苦闘しています。 data1.csv と、data2.csvの、 1列目どうしを比較して、一致率の高いデータを抜き出したいのです。 data1とdata2のレコードの並び順は一致しません。 よろしくお願いします。
- Tacosan
- ベストアンサー率23% (3656/15482)
文字ごとに「その文字が何回出てくるか」を数えればいいだけじゃないか?
お礼
ありがとうございます。大変参考になりました。
補足
恐れ入ります。 その辺を詳しく知りたいのですが、どのようにしたらよいでしょうか。
お礼
ありがとうございます。大変参考になりました。
補足
ありがとうございます。 perlのバージョンは 5.8.8 プログラムの文字コードは EUC-JP ファイルの文字コードも EUC-JP です。 ご返答いただいたプログラムを試してみます。