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 :

Obtenir la position d'un match sous RegExp


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut Obtenir la position d'un match sous RegExp
    Bonjour à tous,

    Je manipule actuellement d'assez gros fichiers (quelques Go chacuns). Pour l'exemple, disons que ce sont des livres sur le fromage.

    Je cherche à trouver la position d'une liste de mots dans mon texte. Je pensais faire une expression régulière du type :
    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( $w =~ m/cantal/ ) { ... }
    Puis de tester pour tous mes mots. Malheureusement, je ne sais pas comment afficher la position de mon match. Est-ce possible ?
    De plus j'ai peur que le process soit long puisqu'il faut systématiquement parcourir tout le fichier.

    Une autre possibilité serait :
    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while($i<length($texte)){
    $mot=substr($i,$i+10); ## je créé une substr pour que ce soit moins lourd a traiter, et je suppose qu'aucun mot ne dépasse 10 caractère
    foreach $fromage (@MaListeDeFromage){
    if( $mot =~ m/^$fromage/ ) {
    print "$fromage : $i \n";  ## ou faire une hash pour pouvoir classer par fromage...
    }}
    $i++;
    }
    Dans ce cas, deux points me font peurs :
    1-la variable $texte contiendrait tout mon fichier de plusieurs Go...
    2-Une boucle de quelques milliards d'occurence ça peut être long... même en perl...

    Y a t'il des façons plus simples ? Bibliothèques ? etc ? Peut être parser mon fichier ligne par ligne ? (je veux aussi savoir si mon mot arrive en bout de ligne ; il pourrait y avoir un saut de ligne au milieu du mot... Donc il faudrait gérer ce cas en mettant en mémoire les derniers caractères de la ligne précédente ? )

    Merci pour votre aide!

    Edit : typo...

  2. #2
    Membre régulier Avatar de elvivo
    Inscrit en
    Mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 105
    Points : 104
    Points
    104
    Par défaut
    $-[0] est la position ou commence le match.
    In code we trust !!

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Essayer de monter en mémoire un fichier de plusieurs Go, je ne te le conseille pas...

    Donc, lire ligne à ligne, et pour chaque ligne, rechercher chaque fromage.

    Oui, ça va prendre un peu de temps, mais il ne faut pas confondre quelques milliards d'octets et quelques milliards d'occurrences, on n'est pas dans le même ordre de grandeur.

    Je parcours régulièrement des fichiers de 10 à 30 Go, ça prend quelques minutes, voire une dizaine ou une quinzaine de minutes pour les plus gros, c'est assez long, mais rien de vraiment rédhibitoire. Après, tout dépend du nombre de mots que tu vas rechercher à chaque fois.

  4. #4
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    Merci à vous deux!

    La meilleure façon de savoir combien de temps ça prend est encore de tester! Si ça prend trop de temps, j'essayerais d'améliorer petit à petit mon algo .

Discussions similaires

  1. [c++] Obtenir la position d'une fenêtre sur l'écran
    Par Silverstone dans le forum Windows
    Réponses: 2
    Dernier message: 05/09/2006, 16h11
  2. Obtenir la position de la souris
    Par gingman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/03/2006, 18h38
  3. Position d'un repertoire sous Composant TreeView ???
    Par EssaiEncore dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/11/2005, 14h33
  4. Obtenir la position du curseur dans une Image
    Par bastoune dans le forum Composants VCL
    Réponses: 6
    Dernier message: 14/11/2003, 21h02

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