Parser fichier txt en PERL

Résolu
KrSt Messages postés 8 Statut Membre -  
 Speedbug -
Bonjour !
J'ai pour but de récuperer les données d'un fichier texte pour pouvoir par la suite les inserer dans une base de données.

Voici un exemple du type de fichier que je souhaite parser:
root@desktop:/data/hey# tail -n 20 tmp/erf/253158/ofi/txt
2007:02:18;14:55;AG4561_2;192.168.0.27;ok
2007:02:18;15:25;Serveur_X12;192.168.0.231;ok

etc etc ..


L'ennui c'est que je n'y connais rien à PERL... Voila ou j'en suis pour l'instant :

#!/usr/bin/perl -w
use strict;
print "Content-type: text/html\n\n";
open FICHIER,"< monfichier.log" or die "Le fichier n'existe pas !";
while ($ligne = <FICHIER>)
{
if($ligne =~ ( chaine de recherche que je ne sais pas ecrire )
  {
    my $date = $1;
    my $heure = $2;
    my $elem = $3;
    my $adIP = $4;
    my $statut = $5;
}
}
close FICHIER;


Voila donc je veux récuperer chaque élément qui m'interresse du fichier dans une variable... Le probleme c'est que je ne sais pas écrire la chaine de recherche correspondante ..

Voila, si quelqu'un à une idée c'est tres volontier !
Configuration: Windows XP
Internet Explorer 6.0

7 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Il faut préciser ce que tu veux faire avec les variables

    Voilà ton code un peu modifier
    #!/usr/bin/perl
    use strict;use warnings;
    
    
    open FICHIER,"< monfichier.log" or die "E/S : $!\n";
    while (my $ligne = <FICHIER>){
        my ($date,$heure,$elem,$adIP,$statut) = split /;/,$ligne;
        # traitment des variables
        .....
        .....
    }
    close FICHIER;
    2
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Je ne comprends pas très bien ce que tu veux.

    Si tu veux utiliser les valeurs contenus dans ton fichier, pourquoi tu récupères les données depuis un formulaire.

    Il faut faire le traitement dans la boucle pour chaque ligne.
    Donc tu te connectes à ta base avant la boucle while, et enusite tu applique le traitement pour chaque ligne.

    Juste un exemple pour me faire comprendre
    #!/usr/bin/perl
    
    use strict;use warnings;
    my ($date,$heure,$elem,$adIP,$statut);
    
    while (my $ligne = <DATA>){
    ($date,$heure,$elem,$adIP,$statut) = split /;/,$ligne;
    # dans la boucle on lit chaque ligne
    # et ensuite j'affiche le contenu de variables
      print "***** DANS LA BOUCLE *****\n";
      print "\$date  : $date\n";
      print "\$heure : $heure\n";
      print "\$elem  : $elem\n";
      print "\$adIP  : $adIP\n";
      print "\$statut: $statut\n";
    }
    
    # à l'exterieur de la boucle
    # on affiche seulement la dernière ligne
    # le trataitement il faut l'exécuter dans la boucle
      print "===== A L'EXTERIEUR DE LA BOUCLE =====\n";
      print "\$date  : $date\n";
      print "\$heure : $heure\n";
      print "\$elem  : $elem\n";
      print "\$adIP  : $adIP\n";
      print "\$statut: $statut\n";
    __END__
    2007:02:18;14:55;AG4561_2;192.168.0.27;ok
    2007:02:18;15:25;Serveur_X12;192.168.0.231;ok
    
    2
  3. KrSt Messages postés 8 Statut Membre 1
     
    Merci beaucoup pour ton aide !
    Je devrais pouvoir m'en sortir avec tout ça :-)

    Je n'ai pas la possibilité de tester maintenant mais à priori ça colle parfaitement à ce que je cherchais.

    Merci bien !

    #!/usr/bin/perl -w
    use strict;
    use DBI;
    use CGI;
    
    my $cgi = new CGI;
    my ($date,$heure,$elem,$adIP,$statut);
    
    print "Content-type: text/html\n\n";
    
    open FICHIER,"< monfichier.log"
        or die "Le fichier n'existe pas ! : $!\n";
    
    #Connection à la base de données mysql NomBase
    my $db = DBI -> connect (("dbi:mysql:dbname=NomBase;host=localhost;","root","******"))
                    or die "connection impossible!";
    
    while ($ligne = <FICHIER>){
    # récupération des éléments
     ($date,$heure,$elem,$adIP,$statut) = split /;/,$ligne;
    # et on insere dans la base
      $db->do("insert into client values ('$date', '$heure', '$elem', '$adIP', '$statut')");
              or die "pb de requete : $DBI::errstr";
    }# fin de traitement de fichier
    close FICHIER;

    1
  4. Speedbug
     
    Il manque la déclaration de ta variable $ligne...

    my $ligne;

    sinon ça marche pas... ;)

    #!/usr/bin/perl

    use warnings;
    use strict;

    use DBI;
    use CGI;

    my $cgi = new CGI;
    my ($date,$heure,$elem,$adIP,$statut);
    my $fichier = "< /chemin/vers/fichier/monfichier.log";
    my $ligne;

    print "Content-type: text/html\n\n";

    open FICHIER,$fichier or die "Le fichier n'existe pas ! : $!\n";

    #Connection à la base de données mysql test

    my $db = DBI -> connect (("dbi:mysql:dbname=test;host=localhost;","root","******")) or die "connection impossible!";

    while ($ligne=<FICHIER>){

    # récupération des éléments

    ($date,$heure,$elem,$adIP,$statut) = split /;/,$ligne;

    # et on insere dans la base

    $db->do("INSERT INTO journaux VALUES ('$date', '$heure', '$elem', '$adIP', '$statut')") or die "pb de requete : $DBI::errstr";

    }

    # fin de traitement de fichier

    close FICHIER;

    Ce script fonctionne parfaitement, il a été testé.
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. KrSt Messages postés 8 Statut Membre 1
     
    Wow ! Merci pour la rapidité de réponse !

    En fait je veux inserer le contenu des variables dans une base MySQL ...

    J'avais continué à modifier mon code entre temps :
    #!/usr/bin/perl -w
    use strict;
    use DBI;
    use CGI;
    my($cgi) = new CGI;
    print "Content-type: text/html\n\n";
    
    open FICHIER,"< monfichier.log" or die "Le fichier n'existe pas !";
    while ($ligne = <FICHIER>)
    {
    if($ligne =~ ( chaine de recherche que je ne sais pas ecrire )
      {
        my $date = $1;
        my $heure = $2;
        my $elem = $3;
        my $adIP = $4;
        my $statut = $5;
    }
    }
    
    #Connection à la base de données mysql NomBase
    my $db = DBI -> connect (("dbi:mysql:dbname=NomBase;host=localhost;","root","******")) or die "connection impossible!";
    
    #recuperation puis insertion d une donnee
    my($date) = $cgi->param("date");
    my($heure) = $cgi->param("heure");
    my($elem) = $cgi->param("elem");
    my($adIP) = $cgi->param("IP");
    my($statut) = $cgi->param("Statut");
    
    $db->do("insert into client values ('$date', '$heure', '$elem', '$adIP', '$statut');")|| die "pb de requete : $DBI::errstr";
    
    close FICHIER;


    Voila, donc je ne sais pas si la syntaxe est exacte vu que c'est mon premier code en PERL, mais ce qui me pose le plus de probleme c'est la recherche pour recuperer les differents element du fichier texte (adresse ip etc ... )
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Ca doit être quelque chose comme ça
    #!/usr/bin/perl -w
    use strict;
    use DBI;
    use CGI;
    
    my $cgi = new CGI;
    my ($date,$heure,$elem,$adIP,$statut);
    
    print "Content-type: text/html\n\n";
    
    open FICHIER,"< monfichier.log"
        or die "Le fichier n'existe pas ! : $!\n";
    
    #Connection à la base de données mysql NomBase
    my $db = DBI -> connect (("dbi:mysql:dbname=NomBase;host=localhost;","root","******"))
                    or die "connection impossible!";
    
    while ($ligne = <FICHIER>){
    # récupération des éléments
     ($date,$heure,$elem,$adIP,$statut) = split /;/,$ligne;
    # et on insere dans la base
      $db->do("insert into client values ('$date', '$heure', '$elem', '$adIP', '$statut')");
              or die "pb de requete : $DBI::errstr";
    }# fin de traitement de fichier
    close FICHIER;
    

    Tu n'as pas besoin de
    if($ligne =~ ( chaine de recherche que je ne sais pas ecrire )
    split est suffisant vu que les données sont séparées par point-virgule
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    dans ton cas je pense que c'est suffisant d'utiliser

    LOAD DATA INFILE 'ton_fichier' INTO TABLE nom_de_table FIELDS TERMINATED BY ';'

    0