Aide sur perl

je commence a apprendre le language PERL et j'aimerais m'aider a pourvoir lire le contenu d un fichier .txt et de le stocker dans une base de données access.
la structur du fichier txt et le suivant ( contient des répititions):
10/08/06*05:05:47*minor*snmpSystemId=MT2FE7B/alarmEntryId=7400*DEVICE=board:0,liu:2
10/08/06*05:05:47*minor*snmpSystemId=MT2FE2B/alarmEntryId=2510*DEVICE=board:0,liu:3
10/08/06*05:15:47*critical*snmpSystemId=MT2FE2B/alarmEntryId=2511*DEVICE=board:0,liu:4
10/08/06*05:25:47*warning*snmpSystemId=MT2FE7B/alarmEntryId=7401*DEVICE=board:0,liu:3
10/08/06*05:35:47*major*snmpSystemId=MT2FE2B/alarmEntryId=2511*DEVICE=board:0,liu:5

et je veux le resultats sous form d'un tableau comme suit (sans repitition):
10/08/06 05:05:47 minor MT2FE7B DEVICE=board:0,liu:2
10/08/06 05:15:47 critical MT2FE2B DEVICE=board:0,liu:4
10/08/06 05:25:47 warning MT2FE7B DEVICE=board:0,liu:3
10/08/06 05:35:47 major MT2FE2B DEVICE=board:0,liu:5

Merci pour votre aide.

15 réponses

  1. Modérateur
    Salut,

    si tu n'as pas la solution jusqu'à ce soir, je vais essayer de t'aider.

    et je veux le resultats sous form d'un tableau comme suit (sans repitition):
    10/08/06 05:05:47 minor MT2FE7B DEVICE=board:0,liu:2


    Pas claire ça.

    Tu veux qui exactement?
    Un champ date, un champ heure, ..
    Et si je compte bien il s'agit de 5 champs.

    lami20j
    0
    1. merci Lami20j
      en fait il s'agit d'une table d'access qui contient les champs suivants:
      date heure severité système carte

      je porte a votre connaissance que le fichier source contient des lignes ki s repete et je vx les suprimer dans le fichier résultant
      0
      1. Modérateur
        Re,

        en fait pour importer un fichier texte dans une base access, je suppose que les champs (dans le fichier texte) doivent être separées par un espace ou tabulation (ça je ne sais pas).

        En ce qui concerne l'élimination des lignes en double, triple,... ça ne pose pas un problème.

        Mets ton fichier sur https://www.cjoint.com/ et je verai ce soir.

        lami20j
        0
        1. les champs dans le fichier texte sont separées par un etoile (*)

          just une remarque j'ai deja crée un programme qui permet de faire ce type de traitement mé c tres long....

          use DBI;
          open (F,"test.txt") || die "$!";
          my @data= <F>;
          close (F);
          my $base='D:\syteme\base.mdb';
          my $dbh=DBI->connect("dbi:ADO:Driver=Microsoft Access Driver (*.mdb); DBQ=$base","","") or die $DBI::errstr;
          foreach $line (@data)
          {
          chomp($line);
          if ($line=~/^(\d{2}\/\d{2}\/\d{2})\*(\d{2}\:\d{2}\:\d{2})\*(\w+)\*snmpSystemId\=(\w+).*\*(.*)\*(.*)/)
          {
          #print "$1\t$2\t$3\t$4\t$5\t$6\n";
          my $Command1= "delete from test where (Date='$1' and heure='$2' and severite='$3' and systeme='$4' and carte='$5')";
          my $sth1= $dbh->prepare($Command1);
          my $Result1 = $sth1->execute;

          $dbh->do("INSERT INTO `test` (Date,heure,severité,systeme,carte) VALUES ('$1','$2','$3','$4','$5')");
          }
          }

          print "fin \n";

          <>;
          0
          1. Modérateur
            Salut,

            voilà comment tu peux obtenir tes variables.
            A adapter à ton code.
            Si tu n'arrives pas à adapter à ton code fait un signe.
            #!/usr/bin/perl
            use warnings;use strict;
            
            open F_LIRE,"test.txt"    # ouvre le test.txt en lecture
                 or die "E/S : $!\n"; # msg si erreur d'ouverture
            		 
            my %h;                    # pour les  lignes en double, triple...
            
            while ( <F_LIRE> ) {      # lis le fichier ligne par ligne
                chomp;                # supprime le caractère de fin de ligne
                next if /^\s*$/;      # ne traite pas les lignes vides
                s/snmp.*?=|\/alarm.*(?=\*device)//gi; # suppression de texte au tour de
                                                      # de texte MT....
                $h{$_}++;                             # stockage dans un hash
            		                          # elimine lignes en double, triple..
                                                      # mieux que d'utiliser un tableau
                                                      # qui stocke tout le fichier
                                                      # y compris les doublons, triplons
                                                      # on consomme moins de mémoire.
            }
            
            foreach (keys %h) {              
            	my ($d,$h,$sev,$sys,$book) = split /\*/,$_; # j'obtiens les variables
            	                                            # nécessaires pour INSERT INTO
            	print "$d : $h : $sev : $sys : $book\n";    # affiche le contenu de 
                                                                # variables
            	                                            # seulement pour montrer leur 
            						    # contenu. 
                						    # A adapter dans ton code
            }
            __END__
            Tu ce que tu vois après __END__
            n'est pas lu par le script
            
            Les commentaires commence avec le #
            
            Pense à ceux qui lisent ton code.
            Et aussi à toi pour la maintenance.
            
            Il faut respecter quelque règles de base
            - l'identation par exemple
            
            Ex:
            - en Perl pour le bloc if on préfère écrire
            
            if ( condition ) {
                instructions;
            }
            
            Quand on ne connaît pas la précédence des opérateurs
            on utilise les paranthèses.
            Cependant l'utilisation en trop ce n'est pas top.
            
            Ex:
            Tu as écrit
            open (F,"test.txt) || die "$!";
            
            si on utilise l'opérateur or qui à
            la précédence la plus faible 
            on n'est pas obligé d'utiliser les paranthèses.
            Et le code devient
            open F,"test.txt or die "$!";
            
            C'est comme tu dit dans le langage normal
            Ouvre le fichier en lecture ou meurs.(Aproche de langage qu'on parle).
            lami20j
            0
            1. Merci infiniment Lami;
              je vé essayer de faire tous les tests et je te fé signe de résultats.
              merci
              0
              1. le programme marche trés bien mé g trouvé klk anomalies concernant le dernier champs dans le fichier source .
                le dernier champs peut commencer par DEVICE comme il pt commencer par d'autre chaine de caractère.
                Merci d'avance.
                0
                1. Modérateur
                  Salut,

                  mé g trouvé klk anomalies concernant le dernier champs dans le fichier source .
                  le dernier champs peut commencer par DEVICE comme il pt commencer par d'autre chaine de caractère.


                  Je me confronte souvent avec ce problème.
                  Quand on parse un fichier c'est bien de connaître la structure de fichier. Dans toutes les lignes que tu m'as donnée je ne vois que DEVICE.
                  Donc pour la prochaine fois il faut préciser.

                  Change la ligne
                  s/snmp.*?=|\/alarm.*(?=\*device)//gi;
                  avec
                  s/snmp.*?=|\/alarm.*(?=\*.*=)//gi;
                  lami20j
                  0
                  1. G deja fé cette operation de remplacer DEVICE par ".*=" mé ca donne l'erreur suivant:
                    Use of uninitialized value in concatenation (.) or string at D:\test\test.pl line 26 ,<F_LIRE> line 12.

                    Merci pour votre collaboration
                    0
                    1. Modérateur
                      Salut,

                      je pense que c'est le moment de m'afficher le fichier que tu traites.
                      Tu peux mettre ton fichier sur https://www.cjoint.com/

                      Ce que tu vois c'est un message d'avertissement, pas forcement une interruption du script.

                      Comme je te l'ai déjà dit si je ne connais pas la structure de fichier je ne peux pas faire grand chose. Je suis totalement aveugle.
                      Ce que je te donnes se base sur les quelques lignes que tu m'as données.

                      lami20j
                      0
                      1. Re ;
                        pr recapitulation voici un extrait du fichier traité:

                        ----------
                        07/04/06*09:03:12*indeterminate*snmpSystemId=MT2FE5B/privateId=MT2FE5B/alarmsId=MT2FE5B/alarmObjectsId=MT2FE5B/alarmEntryId=24353*Could not attach voice resource. *Unspecified application alarm.
                        07/04/06*09:03:12*indeterminate*snmpSystemId=MT2FE5B/privateId=MT2FE5B/alarmsId=MT2FE5B/alarmObjectsId=MT2FE5B/alarmEntryId=24353*Could not attach voice resource. *Unspecified application alarm.
                        07/04/06*09:30:04*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13420*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
                        07/04/06*09:30:04*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13420*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
                        07/04/06*09:30:08*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13421*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
                        07/04/06*09:30:08*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13421*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
                        07/04/06*09:30:11*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13422*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
                        07/04/06*09:30:11*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13422*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
                        07/04/06*09:30:29*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13428*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
                        07/05/06*07:47:08*minor*snmpSystemId=MT2FE2B/privateId=MT2FE2B/alarmsId=MT2FE2B/alarmObjectsId=MT2FE2B/alarmEntryId=9323*DEVICE=board:0,liu:6 ERRORNUM=105 ALARMCODE=1 ERRORTXT=Frame Slip*Frame Slip.
                        07/05/06*07:47:08*minor*snmpSystemId=MT2FE2B/privateId=MT2FE2B/alarmsId=MT2FE2B/alarmObjectsId=MT2FE2B/alarmEntryId=9323*DEVICE=board:0,liu:6 ERRORNUM=105 ALARMCODE=1 ERRORTXT=Frame Slip*Frame Slip.

                        ----------

                        et le programme modefié est le suivant :

                        ------
                        #!/usr/bin/perl
                        use warnings;use strict;

                        open F_LIRE,"test5.txt"
                        or die "E/S : $!\n";

                        my %h;

                        while ( <F_LIRE> ) {
                        chomp;
                        next if /^\s*$/;

                        s/snmp.*?=|\/pri.*(?=\*.*=)//gi;

                        $h{$_}++;

                        }

                        foreach (keys %h) {
                        my ($d,$h,$sev,$sys,$book,$f) = split /\*/,$_;

                        print "$d : $h : $sev : $sys : $book : $f\n";

                        }

                        <>;

                        ---------

                        normalement je dois voir le résultat comme suit:

                        07/04/06 : 09:03:12 : indeterminate : MT2FE5B : Could not attach voice resource. : Unspecified application alarm.
                        07/05/06 : 07:47:08 : minor : MT2FE2B : DEVICE=board:0,liu:6 ERRORNUM=105 ALARMCODE=1 ERRORTXT=Frame Slip : Frame Slip.
                        07/04/06 : 09:30:29 : minor : MT2FE7B : Can not hangup, resource still attached : Unspecified minor alarm in the LI_
                        07/04/06 : 09:30:11 : minor : MT2FE7B : Can not hangup, resource still attached : Unspecified minor alarm in the LI_
                        07/04/06 : 09:03:12 : indeterminate : MT2FE5B : Could not attach voice resource. : Unspecified application alarm.
                        07/04/06 : 09:30:04 : minor : MT2FE7B : Can not hangup, resource still attached : Unspecified minor alarm in the LI_
                        07/04/06 : 09:30:08 : minor : MT2FE7B : Can not hangup, resource still attached : Unspecified minor alarm in the LI_
                        ----

                        thx again
                        0
                        1. Modérateur
                          Re,

                          je vois pourquoi. je te dirai ce soir. je suis au boulot.

                          as-tu donner toutes les possibilités?

                          Could not
                          Can not
                          DEVICE


                          lami20j
                          0
                          1. malhereusement oui,
                            ya d'autre possibilité car le fichier source est le résultat des trap SNMP :(
                            Merci.
                            0
                            1. Modérateur
                              Salut,

                              c'est normal que le script n'affiche pas ce que tu veux.

                              Quand on fait split en utilisant le séparateur l'étoile *, vu que tu as une étoile aussi avant
                              *Unspecified application alarm. on ne stocke pas ce qu'on trouve après la dernière étoile.

                              Donc il nous faut une variable de plus. En gras tu as les modifications
                              #!/usr/bin/perl
                              use warnings;use strict;
                              
                              open F_LIRE,"test.txt"    
                                   or die "E/S : $!\n"; 
                              		 
                              my %h;                   
                              
                              while ( <F_LIRE> ) {      
                                  chomp;               
                                  next if /^\s*$/;      
                                  s/snmp.*?=|\/pri.*(?=\d+\*)//gi;		                                      
                                  $h{$_}++;                             		                                      
                              }
                              
                              foreach (keys %h) {              
                                  my ($d,$h,$sev,$sys,$book,$book2) = split /\*/,$_;	                                            
                                  print "$d : $h : $sev : $sys : $book : $book2\n";
                              }
                              __END__
                              lami20j
                              0
                              1. Ok pour le programme .
                                je vé essayer d'ajouter des ligne pour inserer les données ds la base de données access et je vais vs tenir au courant si ya des probleme ;).
                                Merci encors pr votre aide.
                                a+
                                0