#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; my $filename; if (@ARGV == 1){ $filename = shift; } elsif (@ARGV == 0){ print "Please enter the datafile to validate:\n"; chomp ($filename = ); until (-e $filename){ print "$filename does not exist. Please reenter the name of the file:\n"; chomp ($filename = ); } } else { die "Usage: $0 [filename]\n"; } open my $fh, '<', $filename or die "Could not open $filename: $!\n"; my %errors_of; while (my $line = <$fh>){ chomp $line; my @fields = split /\|/, $line, -1; die "Improperly formatted datafile, line $.\n", Dumper(\@fields) unless @fields >= 9; my ($field_type, $numeric, $character, $date) = @fields[4,6,7,8]; if ($field_type eq 'N'){ if ($numeric eq '' or $character ne '' or $date ne ''){ warn "Line $.: Improper fields populated for field_type of 'N'\n"; $errors_of{'populated_field'}++; } elsif ($numeric !~ /^\d+(:?\.\d+)?$/){ warn "Line $.: Numeric field improperly formatted ($numeric)\n"; $errors_of{'numeric'}++; } } elsif ($field_type eq 'D'){ if ($numeric ne '' or $character ne '' or $date eq ''){ warn "Line $.: Improper fields populated for field_type of 'D'\n"; $errors_of{'populated_field'}++; } elsif ($date =~ m!^(\d{2})/(\d{2})/\d{4}$!){ if ($1 > 12 or $1 < 1){ warn "Line $.: Month out of range ($date)\n"; $errors_of{'date'}++; } elsif ($2 > 31 or $2 < 0){ warn "Line $.: Date out of range ($date)\n"; $errors_of{'date'}++; } } else { warn "Line $.: Improperly formatted date ($date)\n"; $errors_of{'date'}++; } } elsif ($field_type eq 'C'){ if ($numeric ne '' or $character eq '' or $date ne ''){ warn "Line $.: Improper fields populated for field_type of 'C'\n"; $errors_of{'populated_field'}++; } } else { die "Line: $.: Unknown field_type: $field_type\n"; } } my $total_errors; #sum all the errors $total_errors += $_ for values %errors_of; if ($total_errors){ #set zeroes for all error types we didn't find (they're undef otherwise) $errors_of{$_} ||=0 for qw/numeric date populated_field/; print "Errors encountered: Field Population: $errors_of{populated_field}, Numeric: $errors_of{numeric}, Date: $errors_of{date}\n"; } else { print "No errors encountered in the file\n"; }