Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/12/2012, 17h29   #1
trex7g2
Membre du Club
 
Homme
BioInformaticien
Inscription : 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 : 62
Points : 62
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 :
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 :
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...
trex7g2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 19h25   #2
elvivo
Membre régulier
 
Avatar de elvivo
 
Inscription : mai 2002
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 105
Points : 71
Points : 71
$-[0] est la position ou commence le match.
__________________
In code we trust !!
elvivo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 20h01   #3
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 569
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
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 : 569
Points : 1 119
Points : 1 119
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.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 09h48   #4
trex7g2
Membre du Club
 
Homme
BioInformaticien
Inscription : 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 : 62
Points : 62
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 .
trex7g2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h09.


 
 
 
 
Partenaires

Hébergement Web