как проверить, вставлены ли данные в базу данных - PullRequest
0 голосов
/ 04 ноября 2010

Я написал Perl-скрипт для вставки данных из текстового файла в базу данных, но я хочу знать, как добавить к нему проверку качества, т. Е. Как я могу проверить данные, вставленные в базу данных, или нет, то есть он должен отображать, говоря данные была успешно вставлена ​​... а также, когда дата была вставлена ​​из текста в базу данных, она просто отображает 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 ]

2 голосов
/ 04 ноября 2010

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

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

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

2 голосов
/ 04 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...