perl:用于比较字符串对的模式匹配

时间:2011-03-20 17:25:45

标签: regex perl string-comparison

我有一个问题是计算每对字符串的多数selectedresult。我的代码:如果用户选择sysA,sysB或两者而不考虑字符串对,似乎只计算。我也有一个问题需要进行多重比较并为每对配对7个用户。

( $file = <INFILE> ) {
@field = parse_csv($file);
chomp(@field);
@query = $field[1];

for($i=0;$i<@query;++$i) {
    if ( ($field[2] eq $method) || ($field[3] eq $method)){
    if ( $field[4] eq $field[2]) {
    print "$query[$i]: $field[2], $field[3], $field[4]\n";
    $counta++;
    } 
    if ( $field[4] eq $field[3]) {
    print "$query[$i]: $field[2], $field[3]: $field[4]\n";
    $countb++;
    }
    if ( $field[4] eq ($field[2] && $field[3])) {
    #print "$query[$i]: $field[2]$field[3]\n";
    $countc++;

}

数据:对于每个查询,我有3种不同的字符串比较组合。

  • 比较( “lucene的-STD-REL”, “lucene的-诺伦RR”);
  • 比较( “lucene的-诺伦RR”, “lucene的-STD-REL”);
  • 比较( “lucene的-诺伦RR”, “随机”);
  • 比较(“随机”,“lucene-noLen-rr”);
  • 比较( “lucene的-诺伦RR”, “lucene的-诺伦-REL”);
  • 比较( “lucene的-诺伦-REL”, “lucene的-诺伦RR”);

一对的示例数据(每个对评估7个用户):

  • 用户1,雄性,lucene的-STD-REL,随机,lucene的-STD-relrandom
    • USER2,男性用lucene-STD-REL,随机,lucene的-STD-REL
    • 用户3,雄性,lucene的-STD-REL,随机,lucene的-STD-REL
    • USER4,男性用lucene-STD-REL,随机,lucene的-STD-REL
    • USER5,男性用lucene-STD-REL,随机,lucene的-STD-relrandom
    • user6,男性用lucene-STD-REL,随机,lucene的-STD-REL
    • user7,男性用lucene-STD-REL,随机,lucene的-STD-REL

需要输出示例:查询1:男性健身模型

  • lucene-std-rel:5,random:0,both:2 ---&gt;多数:lucene的-STD-REL

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

好吧,如果没有比你要求的更复杂,这就是我想出的可能方法。

#!/usr/bin/perl
use strict;

my %counter = ( "A" => 0, "B" => 0, "AB" => 0, "majority" => 0);

while(<DATA>){

    chomp;
    next unless $_;
    my ($workerId,$query,$sys1,$sys2,$resultSelected) = split(',');

    $counter{$resultSelected}++;

}
$counter{'majority'} = (sort {$counter{$b} <=> $counter{$a}} keys %counter)[0];
print "A: $counter{'A'} B: $counter{'B'} both(AB): $counter{'AB'} majority: $counter{'majority'}\n";


__END__

user1,male,A,B,A

user2,male,A,B,AB

user3,male,A,B,B

user4,male,A,B,A

user5,male,A,B,A

这个输出是: 答:3 B:1两者(AB):1多数:A

我不觉得我的榜样完全解决了“多数”类型不止一种的想法。例如,如果A和B都是9,我希望它们都列在那里。因为你没有问过,所以我没有那么费心,但希望这会让你走上正确的道路。

答案 1 :(得分:-1)

open( INFILE, "compare.csv" ) or die("Can not open input file: $!");

while ( $file = <INFILE> ) {
@field = parse_csv($file);
chomp(@field);
@query = $field[1];

for($i=0;$i<@query;++$i) {
    if ( ($field[2] eq $method) || ($field[3] eq $method)){
    if ( $field[4] eq $field[2]) {
    print "$query[$i]: $field[2], $field[3], $field[4]\n";
    $counta++;
    } 
    if ( $field[4] eq $field[3]) {
    print "$query[$i]: $field[2], $field[3]: $field[4]\n";
    $countb++;
    }
    if ( $field[4] eq ($field[2] && $field[3])) {
    #print "$query[$i]: $field[2]$field[3]\n";
    $countc++;

}

} 

}

sub parse_csv {     我的$ text = shift;     我的@new =();     $($,$ +)同时$ text = ~m {        “([^ \” \] (?:\。[^ \ “\] )*)” ,?            | ([^,] +),?            | ,        } GX;     push(@ new,undef)if substr($ text,-1,1)eq',';     返回@new; }`