как проверить, вставлены ли данные в базу данных

0

Я написал perl script для вставки данных из текстового файла в базу данных, но я хочу знать, как добавить к нему проверку качества, т.е. hw я могу проверить данные, вставленные в базу данных, или нет. данные были вставлены успешно.. а также когда дата была вставлена ​​из текста в базу данных, она просто отображает 0000-00-00... какие изменения должны быть сделаны...

мой код -

#!/usr/bin/perl 

#---------------------------------------------------------------------
# Description: Extract Lab data from text file and insert to database
#---------------------------------------------------------------------

# Modules Required
use DBI;  # check drivers


#print "vs2-001-001-ma-sampleFile\n";


my $filename = "vs2-001-001-ma-sampleFile.txt";   

#initialize variable $count
my $count = 0 ;    
#initialise variables for parameters
my ($paraval, $paraname, $pararange, $paraunit);
#uncomment it To use keyboard input. and type filename with extension
# Ex: fileName.txt or fileName.csv    
#chomp($filename=<>);       
open (OUT,">>$filename.csv") || die print "No\t $!";
close OUT;

open (IN,"$filename") || die print "Noo Input. $!";
my @file=<IN>;

#join the lines with # dilimits
my $string = join('#', @file);

    $string =~s /[\r]//g;   # To remove space. 
    $string =~s /[\n]//g;
    $string =~s /[\t]//g;   # To remove tab


print "\n Parsing data now....\n";
# pattern under while loop will do the work. 
# it will take date as 13 Oct 2010 in $1 and rest values in $2  
# $string=~/Equine Profile Plus\s+#(.*?\s+)\s+.*?(Sample.*)##/g

 while($string=~/Equine Profile Plus\s+#(.*?\s+)\s+.*?(Sample.*?)##/g)
 {
    my($date,$line,$Sample_Type,$Patient_ID, $Sample_Id,
         $Doctor_Id,$Location,$Rotor, $Serial,$para,
         $QC,$HEM,$LIP,$ICT);
    $count++;

    $date=$1;
    $line=$2;       
    if ($line=~/Sample Type:(.*?)#/gis){
        $Sample_Type=clean($1);
    }if ($line=~/Patient ID:(.*?)#/gis){
        $Patient_ID=clean($1);
    }if ($line=~/Sample ID:(.*?)#/gis){
        $Sample_Id=clean($1);
    }if ($line=~/Doctor ID:(.*?)#/gis){
        $Doctor_Id=clean($1);
    }if ($line=~/Location:(.*?)#/gis){
        $Location=clean($1);
    }if ($line=~/Rotor Lot Number:(.*?)#/gis){
        $Rotor=clean($1);
    }if ($line=~/Serial Number:(.*?)#/gis){
        $Serial=clean($1);
    }if ($line=~/#(NA+.*?GLOB.*?)#/gis){

        $para=$1;
        $para =~ s/#/;/g;
        $para =~ s/\s\s/ /g;   #remove spaces.
        $para =~ s/\s\s/ /g;   
        $para =~ s/\s\s/ /g;  
        $para =~ s/\s\s/ /g;
        $para =~ s/\s\s/ /g;
        $para =~ s/\s\s/ /g;
        $para =~ s/ /:/g;

        if ($line=~/#QC(.*?) #HEM(.*?) LIP(.*?) ICT(.*?)  /gis){
        $QC=clean($1);
        $HEM=clean($2);
        $LIP=clean($3);
        $ICT=clean($4);
    }
        while($para =~ /(.*?):(.*?):(.*?);/g){
        $paraname = $1;
        $paraval = $2;
        $pararange = $3;
        #$paraunit = $4;    

               #data from text file written to a CSV file.
        open (OUT,">>$filename.csv") || die print "No";             
               print OUT "\"$count\",\"$date\",\"$Sample_Type\",\"$Patient_ID\",
                   \"$Sample_Id\",\"$Doctor_Id\",\"$Location\",\"$Rotor\",
                   \"$Serial\", \"$QC\",\"$HEM\",\"$LIP\",\"$ICT\",
                   \"$paraname\",\"$paraval\",\"$pararange\",\n";
        }
    }
 }
 close OUT;

 #Load csv into mysql
print "\n Inserting into data base \n";
# comment it while not loading into the database.

&loaddata('$filename.csv');      
print "\n Database insert completed \n";
 sub clean
{
my ($line) = shift (@_);
$line =~ s/\n//g;
$line =~ s/\r//g;
$line =~ s/^\s+//g; 
$line =~ s/\s\s//g;
$line =~ s/\s+$//g;
$line =~ s/#//g;
return ($line);
}



#init the mysql DB
sub init_dbh{

$db="parameters";
$host="localhost";
$user="**";
$password="**";

my $dbh   = DBI->connect ("DBI:mysql:database=$db:host=$host",
                          $user,
                          $password)
                          or die "Can't connect to database: $DBI::errstr\n";

       return $dbh;

}

#Load data to mysql table
sub loaddata{
        my ($name) = @_;
        my $DBH = init_dbh( );
        my $STH_GO = $DBH->prepare(q{
           LOAD DATA LOCAL INFILE 'vs2-001-001-ma-sampleFile.txt.csv' 
            INTO TABLE parameter FIELDS TERMINATED BY ',' ENCLOSED BY
            '"' LINES TERMINATED BY '\n'; })or die "ERROR: ". $DBI::errstr;
        $STH_GO->execute();

        }
  • 2
    Не имеет значения, но так как вы выводите CSV, вы можете захотеть взглянуть на Text :: CSV, чтобы проанализировать ваши входные данные и создать выходные данные. Также используйте строгие и используйте предупреждения и лексические файловые дескрипторы. Кроме того, не видя преимущества объединения всех строк в файле с # , когда вы можете просто проходить построчно через один и тот же эффект.
Теги:

2 ответа

2

Проверить возвращаемое значение execute, с одной стороны.

2

Я обычно загружаю данные программным способом из своего кода, а не полагаюсь на базу данных для ее загрузки. Таким образом, я могу проверить записи перед вставкой. Другим преимуществом является то, что я знаю, если запись не вставляется и есть возможность попытаться выяснить, в чем проблема, и повторить ввод, или позже нажать запись в другой файл для ручной проверки.

В вашем коде вы обрабатываете данные, а затем возвращаете их обратно в файл для загрузки БД. Почему бы не загружать строки данных при их обработке? Предоставление базы данных большей объемной загрузке происходит быстрее, но это не дает хорошей детализации; Обычно это все или ничего, и если это ничего, ваша возвращенная ошибка не будет вам много рассказывать, кроме того, что файл не загружается.

Вы также забрасываете файл в память, поэтому я рекомендую вам прочитать PerlFaq 5, в котором есть хороший раздел How can I read in an entire file all at once?. На странице Perl Slurp Ease возможно больше, чем вы хотите узнать об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню