use strict; use Text::CSV_XS; use DBI; my $csv_inputfile = "input.csv"; # change me my %data; # hash for storing csv data my $csv = Text::CSV_XS->new; open my $fh, '<', $csv_inputfile or die "can't open $csv_inputfile: $! \n"; while (my $line = <$fh>) { $line =~ s/^\s+//; # strip leading whitespace next unless $line; # ignore blank lines # assume CSV file looks like: ip, user, nbname if ( $csv->parse($line) ) { my ($ip, $user, $nbname) = $csv->fields(); next unless $ip; $data{$ip} = { USER => $user || '', NBNAME => $nbname || '', }; } else { my $error = $csv->error_diag(); print "Parse error: line $. : $error.\n"; } } close $fh; my $user = "db_user"; # change me my $pass = "db_pass"; # change me my $dbh = DBI->connect( "dbi:mysql:pstsize", $user, $pass, {RaiseError => 1, AutoCommit => 1}, ); unless ($dbh) { die "Could not get database handle."; } my $sth = $dbh->prepare( select_data() ); eval { $sth->execute(); }; if ($@) { die "Database error: ", $dbh->errstr; } print "
\n";
while ( my ($ip, $user, $nbname) = $sth->fetchrow ) {
unless ($user) {
print "DB missing USER for $ip.";
if ($data{$ip}{'USER'}) {
print ".. but CSV file has value: $data{$ip}{'USER'}.";
}
print "\n";
}
unless ($nbname) {
print "DB missing NBNAME for $ip.";
if ($data{$ip}{'NBNAME'}) {
print ".. but CSV file has value: $data{$ip}{'NBNAME'}.";
}
print "\n";
}
}
print "";
$sth->finish;
$dbh->disconnect;
sub select_data {
return <<" END_SQL";
SELECT DISTINCT
ipaddr,
user,
nbname
FROM
sizehist
ORDER BY
ipaddr
END_SQL
}