2010-11-09 10 views
0

mon script estformat de date à insérer dans la base de données

#!/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"; 

my $count = 0 ; #initialize variable $count 
my ($paraval, $paraname, $pararange, $paraunit); #initialise variables for parameters 
#chomp($filename=<>); #uncomment it To use keyboard input. and type filename with extension Ex: fileName.txt or fileName.csv 

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 




# 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++; 

my $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;  

    # convert the date into DBMS-FORMAT 
    my %map = ('Jan' => '01' , 'Feb' => '02', 'Mar' => '03', 'Apr' => '04','May' => '05', 
    'Jun' =>'06' ,'Jul'=>'07', 
    'Aug'=>'08','Sep'=>'09','Oct'=>'10','Nov'=>'11','Dec'=>'12' ); 

    if ($date =~ m/(..).(...).(....)/) { 
     my ($d, $m, $y) = ($1, $2, $3); 
    $out = sprintf $y, $map{$m}, '%d-%02d-%d', $d; 

    } 
    else{ 
    die ; 
    } 
    print "Parsing the input ...\n"; 
    open (OUT,">>$filename.csv") || die print "No"; #data from text file written to a CSV file. 
     print OUT "\"$count\",\"$out\",\"$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 database\n"; 
&loaddata('$filename.csv'); # comment it while not loading into the database. 
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=""; 
$host=""; 
$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(); 

     } 

cela donne le format de date dans le fichier CSV 13-10-2010, mais lors de l'insertion dans la base de données donne 0000-00-00..please me aider modifier le script.

Répondre

0

Les dates dans MySQL sont spécifiées sous la forme AAAA-MM-JJ, pas JJ-MM-AAAA. Ajustez la sortie pour correspondre à ce format.

+0

comment changer le format ... je n'ai aucune idée ... devrait changer dans la section mysql ?? – user496818

+0

Vous devez changer le format que votre script génère. Changez votre appel de sprint. Incidemment, je ne suis pas sûr de savoir comment l'appel que vous avez fonctionne réellement de la façon dont vous le décrivez, puisque la chaîne de modèle doit être fournie comme premier argument, pas le troisième. Vous voulez probablement quelque chose comme: sprintf '% 04d-% 02d-% 02d', $ y, $ map {$ m}, $ d – cdhowie

+0

J'ai essayé de faire de cette façon .... mon% map = ('Jan' => '01', 'févr' => '02', 'Mar' => '03', 'avr' => '04', 'mai' => '05', \t \t \t Jun '=>' 06 ',' Jul '=>' 07 ', \t \t \t ' Aug '=>' 08 ',' Sep '=>' 09 ',' Oct '=>' 10 ',' Nov '=>' 11 ',' Dec '=>' 12 '); \t \t \t if ($ date = ~ m /(..).(..).(......)/) { \t \t \t mon ($ d, $ m, $ y) = (1 $, 2 $, 3 $); \t \t \t $ out = sprintf '% 04d-% 02d-% 02d', $ y, $ map {$ m}, $ d; \t \t \t \t \t} \t \t else { \t \t \t meurent; \t \t} mais ma sortie est 2010-00-13..n not 2010-10-13 – user496818

Questions connexes