我正在尝试将散列与文件匹配。但是,由于标点符号和空格,我正在搜索的文件和文件并不完全匹配。例如,我的文件中可能有"JE工业,公司“和"JE工业公司”。这两个显然不匹配,因为",",逗号。
因此,我的解决方案是拥有一个散列和一个文件,并对每个文件执行修改(在文件和散列值中替换标点符号,所以“”将与“”匹配,以及其他一些规则)。一旦匹配满意,就转到散列中针对文件的下一项。如果该匹配不满意,转到下一个规则"elsif",并尝试匹配,如果它满意,转到下一个项目等。我也希望有一个未修改的散列和行的副本,以便每个的原始不被修改。因此,基本上一次只应用一条规则。
所以我一直在研究如何解决这个问题,但是我的结果并不是我想要的。
码
open(my $fh, "list.txt");
while(<$fh>) {
my($line) = $_;
chomp($line);
my %hash = (
12345 => 'JE Industries, Incorporated',
123355 => 'Josh Industries, Inc'
);
while( my( $key, $value ) = each %hash ) {
if($value =~ s/[[:punct:]]//gi eq $line =~ s/[[:punct:]]//gi) {print $line,",",$key,"\n";} #replace punctuation on both $line and $value to make them match##
elsif($value =~ s/[\s]//gi eq $line =~ s/[\s]//gi) {print $value,",",$key,"\n";} ## if punctuation does not do it replace space##
}
}我的文件,list.txt
JE工业公司
乔什工业公司
吉姆鲍勃公司
我的输出
JE工业公司,123355
乔希工业公司,123355
期望输出
JE工业公司,"JE工业,公司“,12345
乔希工业公司,“乔希工业公司”,123355
original_Value_from_file,"original_Value_from_hash",与每个
它将我的项从散列匹配到文件,但是,它只是将散列中的最后一个键分配给每个值。另外,我不太确定如何打印每一行/散列的原始形式以及匹配结果。还请记住,对于修改,我希望从一开始就对每条规则进行修改。换句话说,在第二个规则发生"$value =~ s/ \s /gi eq $line =~ s/\s/gi“的情况下,我想在"JE工业,公司”中替换\s,而不是在"JE工业公司“中。
最后,我希望我的结果是来自散列值的匹配的原始形式,$line值的原始形式,以及它们对应的散列键。我还想执行更多的规则,而不仅仅是省略标点符号和空格,以使更接近的匹配。
发布于 2015-02-23 17:23:37
很多时候,提前准备数据就更容易了。使您的代码稍后变得更简单。
下面是我要做的,创建一个非标点符号名称的反向散列到id。
在循环文件时,我只需将非标点符号与id散列进行比较,才能找到匹配项。
下面的工作示例
use strict;
use warnings;
my %id_to_name = (
12345 => 'JE Industries, Incorporated',
123355 => 'Josh Industries, Inc'
);
#Create a reverse map with out any punctuation
my %no_punc_name_to_id;
while (my ($key, $value) = each %id_to_name) {
$value =~ s/[[:punct:]]//gi;
$no_punc_name_to_id{$value} = $key;
}
my $filename = 'list.txt';
open my $fh , '<' , $filename or die "Cannot read '$filename': $!";
while(my $line = <$fh>) {
chomp($line);
$line =~ s/[[:punct:]]//gi;
if(exists $no_punc_name_to_id{$line}) {
my $id = $no_punc_name_to_id{$line};
print $line,",","\"$id_to_name{$id}\"",",",$id,"\n";
}
}https://stackoverflow.com/questions/28678875
复制相似问题