私はこのPerlスクリプト(Jeff Schallerのおかげで)を使って、2つの別々のcsvファイルのタイトルフィールドにある3つ以上の単語を次のように一致させました。
別のcsvファイル内のフィールドに3つ以上の単語を一致させます。
スクリプトは次のとおりです。
#!/usr/bin/env perl
my @csv2 = ();
open CSV2, "<csv2" or die;
@csv2=<CSV2>;
close CSV2;
my %csv2hash = ();
for (@csv2) {
chomp;
my ($title) = $_ =~ /^.+?,\s*([^,]+?),/; #/ match the title
$csv2hash{$_} = $title;
}
open CSV1, "<csv1" or die;
while (<CSV1>) {
chomp;
my ($title) = $_ =~ /^.+?,\s*([^,]+?),/; #/ match the title
my @titlewords = split /\s+/, $title; #/ get words
my $desired = 3;
my $matched = 0;
foreach my $csv2 (keys %csv2hash) {
my $count = 0;
my $value = $csv2hash{$csv2};
foreach my $word (@titlewords) {
++$count if $value =~ /\b$word\b/i;
last if $count >= $desired;
}
if ($count >= $desired) {
print "$csv2\n";
++$matched;
}
}
print "$_\n" if $matched;
}
close CSV1;
タイトルの間の特定の単語を無視し、一致する単語として分類したくないことに気づきました。比較する前に、sedを使用してcsvファイルを削除しましたが、プロセスからデータが失われるため、理想的ではありません。このPerlスクリプトに例外と見なされる単語をどのように追加しますか?たとえば、スクリプトがタイトルを一致させるときに3つの個々の単語を無視してルールの例外になるようにしたいとしますand
if
。the
ベストアンサー1
旅行後
my @titlewords = split /\s+/, $title; #/ get words
配列から単語を削除するコードを追加します。
my @new;
foreach my $t (@titlewords){
push(@new, $t) if $t !~ /^(and|if|the)$/i;
}
@titlewords = @new;