diera
diera

Reputation: 1

perl: pattern matching for comparision pair of string

I have a problem to count the majority selectedresult for each pair of string. my code: it seems just count if user choose either sysA, sysB or both without considering the pair of string. I'm also have a problem to make multiple comparision and deal with 7 users for each pair.

( $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++;

}

data: for each query, i have 3 different combination of string comparision.

example data for one pair (7 users evaluate for each pair):

example output required: query 1:male fitness models

any help is very much appreciated.

Upvotes: 0

Views: 424

Answers (2)

diera
diera

Reputation: 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 { my $text = shift; my @new = (); push( @new, $+ ) while $text =~ m{ "([^\"\](?:\.[^\"\])*)",? | ([^,]+),? | , }gx; push( @new, undef ) if substr( $text, -1, 1 ) eq ','; return @new; }`

Upvotes: -1

Caterham
Caterham

Reputation: 2301

Well, without making this more complex than you requested, here is what I came up with as a possible approach.

#!/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

The output of this is: A: 3 B: 1 both(AB): 1 majority: A

I don't feel like my example to you fully addresses the idea of there being more than one type with the "majority". For instance, if both A and B are 9, I'd expect them both to be listed there. I didn't bother to do that since you didn't ask, but hopefully this will get you along the right path.

Upvotes: 2

Related Questions