newbie1238585
Programmer
I am comparing a csv file with a text file and match the error when regex pattern matched. I pasted whole script to ease the help. How to recognize asterisk * as wildcard operator when reading csv file? "Parse csv file part" in the code below should make the change.
Expected output when csv file has * wildcard
My csv:
Error file:
Script:
Expected output when csv file has * wildcard
Perl:
Error: Generated clock *
Perl:
WAIVED (3 waivers) - setup_timing,100,blockA:
Error: Generated clock 123abc is not satisfiable; zero source latency will be used. (GRF-011)
Error: Generated clock 678trt is not satisfiable; zero source latency will be used. (GRF-011)
Error: Generated clock 789def is not satisfiable; zero source latency will be used. (GRF-011)
Waiver Owner: alex
Ticket no: testing
Justification: NA
My csv:
Code:
#Process,#Block,#Stage name,#Waiver type,#Waiver owner,#Justification,#Ticket number,#Error msg
100,blockA,setup_timing,T,alex,testing,NA,Error: Generated clock 123abc is not satisfiable; zero source latency will be used. (GRF-011)
100,blockA,setup_timing,T,alex,testing,NA,Error: Generated clock 678trt is not satisfiable; zero source latency will be used. (GRF-011)
100,blockA,setup_timing,T,alex,testing,NA,Error: Generated clock 789def is not satisfiable; zero source latency will be used. (GRF-011)
100,blockA,setup_timing,T,alex,testing,NA,Error: Generated clock *
Error file:
Code:
Error:
Error: Generated clock 123abc is not satisfiable; zero source latency will be used. (GRF-011)
Error: Generated clock 678trt is not satisfiable; zero source latency will be used. (GRF-011)
Error: Generated clock 789def is not satisfiable; zero source latency will be used. (GRF-011)
Script:
Perl:
#!/usr/bin/perl
use Text::CSV;
use strict;
use warnings;
my $csv = Text::CSV->new({ sep_char => ',' });
my $collect;
# Open and read the CSV file
open(my $data, '<', "waiver2.csv") or die "Could not open 'file.csv' $!\n";
# Open and read the error file
open(my $err, '<', "file2.txt") or die "Could not open 'error.txt' $!\n";
my $stage_name = '';
my $process_name = '';
my $block_name = '';
my @errors;
my %unwaived_errors;
my @unwaived_order;
# Parse the file
while (my $line = <$err>) {
chomp $line;
# Start collecting when "Error:" is found
if ($line eq 'Error:') {
$collect = 1;
next;
}
# Stop collecting when an empty line is found
if ($collect && $line eq '') {
$collect = 0;
}
# Collect lines
if ($collect) {
push @errors, $line;
if (!exists $unwaived_errors{$line}) {
push @unwaived_order, $line;
}
$unwaived_errors{$line}++;
}
}
close $err;
my %grouped_errors;
# Parse the csv file
while (my $line = <$data>) {
chomp $line;
if ($csv->parse($line)) {
my @fields = $csv->fields();
# check for error messages only in the rows with actual data (not header)
if ($fields[0] =~ /^\d/) {
my ($process, $block, $stage, $waiver_type,$owner, $ticket, $justification, $error_msg) = @fields[0, 1, 2, 3, 4, 5, 6,7];
# check for each error in the error.txt file
foreach my $err (@errors) {
if ($stage_name eq $stage && $process_name eq $process && $block_name eq $block && index($err, $error_msg) != -1) {
push @{$grouped_errors{$owner}{$justification}}, {
error => $err,
stage => $stage,
process => $process,
block => $block,
ticket => $ticket
};
$unwaived_errors{$err} = 0 if exists $unwaived_errors{$err}; # Here we set the counter to 0 for a waived error
last;
}
}
}
} else {
warn "Line could not be parsed: $line\n";
}
}
close $data;
my $number_errors_waived = 0;
# Print out the grouped errors
foreach my $owner (keys %grouped_errors) {
foreach my $justification (keys %{$grouped_errors{$owner}}) {
my $first_error_data = $grouped_errors{$owner}{$justification}[0];
$number_errors_waived += @{$grouped_errors{$owner}{$justification}};
print "\nWAIVED ($number_errors_waived waivers) - $first_error_data->{stage},$first_error_data->{process},$first_error_data->{block}:\n";
foreach my $error_data (@{$grouped_errors{$owner}{$justification}}) {
print " $error_data->{error}\n";
}
print " Waiver Owner: $owner\n";
print " Ticket no: $first_error_data->{ticket}\n";
print " Justification: $justification\n";
}
}
# Print out the unwaived errors
my @unwaived_errors;
foreach my $error (@unwaived_order) {
if ($unwaived_errors{$error} > 0) {
push @unwaived_errors, $error;
}
}
my $number_unwaived_errors = @unwaived_errors;
if (@unwaived_errors) {
print "\nFAILED (0 waiver, $number_unwaived_errors unwaived) - $stage_name,$process_name,$block_name:\n";
foreach my $unwaived_error (@unwaived_errors) {
print " $unwaived_error\n";
}
}