IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

regexp au mieux


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de lu6fer
    Inscrit en
    Avril 2008
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 141
    Par défaut regexp au mieux
    Bonjours a toutes et a tous,

    voila j'ai un léger souci avec une regexp en perl.

    je doit parcourir un fichier de log, et y extraire quelques information, jusque la pas de problème

    ensuite est grâce a une table de hash je repère quelques info, et les converti en texte.

    table de hash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %corres = { '.1.3.6.1.4.1.2011.6.3.23.6.0' => 'hwConfigLockOperate' };
    La table de hash n'est ici qu'un extrait, elle est créer a partir d'un fichier plat csv


    je parcours donc ma table de hash et cherche a matcher les correspondances de mon fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my @tmp = split (/\|/,$_);
                    foreach my $info (@tmp) {
                            foreach my $h (keys(%corres)) {
                                    if ($info =~ /^$h(.*)$/) {
                                            print "\t".$corres{$h}." => ".$1."\n";
                                    }
                            }
                    }
    Fichier
    OID|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.3.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.5.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.14.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.26.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.25.4194337024.32
    OID|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.3.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.5.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.14.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.26.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.5.1.25.4194337024.32
    OID|.1.3.6.1.4.1.2011.5.100.1.1.1.47.1.1.4194337024.32|.1.3.6.1.4.1.2011.5.100.1.1.1.47.1.2.4194337024.32
    OID|.1.3.6.1.4.1.2011.6.3.23.6.0|.1.3.6.1.4.1.2011.6.3.23.2.0
    OID|.1.3.6.1.4.1.2011.5.100.1.1.1.12.1.6.4194337024.4294967295
    OID|.1.3.6.1.4.1.2011.5.100.1.1.1.13.1.3.4194337024.32.835.47
    OID|.1.3.6.1.4.1.2011.5.14.5.2.1.2.4294967295
    Le probleme c'est que certain OID, sont tres proches exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .1.3.6.1.4.1.2011.5.14.5.2.1.2
    .1.3.6.1.4.1.2011.5.14.5.2.1.20
    dans ce cas, si la valeur .1.3.6.1.4.1.2011.5.14.5.2.1.20, il ne matchera que .1.3.6.1.4.1.2011.5.14.5.2.1.2

    Il serait possible de réfléchir a l'inverse, et de chercher a matcher directement dans le fichier, et a faire la correspondance, mais les OID du fichier de log, n'ont pas la meme taille (nb de point), les valeurs concatener apres les OID (ex :4194337024.32.835.47) ne sont pas les meme, et n'ont pas la meme taille

    Donc ma question est, est-il possible de forcer a matcher au mieux, a savoir trouver la correspondance la plus proche, dans mon exemple, le .1.3.6.1.4.1.2011.5.14.5.2.1.20 au lieu du .1.3.6.1.4.1.2011.5.14.5.2.1.2.

    ou sinon y a t il une autre façon de voir les choses a laquelle je n'aurais évidement pas pensé.

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de lu6fer
    Inscrit en
    Avril 2008
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 141
    Par défaut
    Personne pour me donner une indication ?

    je me suis peut être mal exprimer

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 38
    Par défaut
    Bonjour.
    J'ai peut-être une solution ça peut paraître stupide mais si au lieu de mettre le pattern matching que j'ai vu sur ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if ($info =~ /^$h(.*)$/)
    Si tu mettait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if ($info =~ /^$h\.(.*)$/)
    Je pense que tu devrait pouvoir avoir la valeur qui t'intéresse.
    En effet si j'ai bien compris tu as la clé de ta table de hashage qui précède la valeur que tu souhaites afficher. Et si j'en croit ton fichier, ces deux valeurs sont séparées par un ".".
    Si c'est le cas les valeurs de clé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .1.3.6.1.4.1.2011.5.14.5.2.1.2
    .1.3.6.1.4.1.2011.5.14.5.2.1.20
    ne devrait plus être confondues par ton pattern matcher.
    Voilou
    FX

  4. #4
    Membre expérimenté Avatar de lu6fer
    Inscrit en
    Avril 2008
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 141
    Par défaut
    J'y ai pensé aussi, mais le problème est que certain OID n'ont pas de point puisqu'ils n'ont pas de donnée concaténées.

    j'ai donc tester avec l'ajout d'un '?'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($info =~ /^$h\.?(.*)$/)
    mais le le problème est le même il me resort l'oid le plus court.

    donc pour le moment j'ai trouver une solution, qui n'est pas tres propre je trouve mais qui a le mérite de fonctionné correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    foreach my $info (@tmp) {
    		foreach my $h (keys(%corres)) {
    				if ($info =~ /^$h(.*)$/) {
    						# Si $1 existe, on a des donnee concattener
    						if ($1) {
    								# On peu donc matcher avec un point pour eviter
    								# les confusion d'oid
    								if ($info =~ /^$h\.(.*)$/) {
    										print "\t".$corres{$h}." => ".$1."\n";
    								}
    						}
    						# Sinon on n'a pas de donnee concatener
    						# on affiche donc que l'oid
    						else {
    								print "\t".$corres{$h}."\n";
    						}
    				}
    		}
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 38
    Par défaut
    Bah si ça marche une petite amélioration algorithmique qui te permettra pour que ce soit un peu plus propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    print "\t".$corres{$h};
    if ($info =~ /^$h(.*)$/) {
     # Si $1 existe, on a des donnee concattener
     if ($1) {
      # On peu donc matcher avec un point pour eviter
      # les confusion d'oid
      if ($info =~ /^$h\.(.*)$/) {
       print " => ".$1;
      }
     }
    }
    print "\n";

  6. #6
    Membre expérimenté Avatar de lu6fer
    Inscrit en
    Avril 2008
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 141
    Par défaut
    Ton algo ne correspond pas a mon besoin, mais, rien de bien grave puisque mal grès mon insatisfaction, mon 1er jet a le mérite de fonctionner.

    Puis rien ne m'oblige a atteindre un niveau de performance extrême

    en tout cas merci pour tes pistes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Qu est ce qu il vaut mieux faire.
    Par rvzip64 dans le forum Requêtes
    Réponses: 7
    Dernier message: 03/06/2004, 16h04
  2. [langage] [RegExp] Question d'expression régulière
    Par cloogy dans le forum Langage
    Réponses: 5
    Dernier message: 08/10/2003, 09h29
  3. regexp
    Par mathieu gérard dans le forum ASP
    Réponses: 4
    Dernier message: 02/10/2003, 18h05
  4. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59
  5. Langage le mieux adapté pour application client serveur ?
    Par guenus dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 17/06/2002, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo