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 :

Récupérer motif entre des guillemets


Sujet :

Langage Perl

  1. #21
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    Ok merci pour ces directive je vais analyser cela.

    Une dernière question après je ne t'embête plus

    Admettons que je veuilles réecrire mon fichier mais SANS les chaines.

    Du coup je vais faire un deuxième open ECRIRE_fichier_sans_chaines
    Et je vais intégrer des print ECRIRE_fichier_sans_chaines
    Ou puis je mettre ça dans mon code ?
    Et comme écrire les lignes sans les chaines trouvés ?

    Merci encore de ton aide.

  2. #22
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    Effectivement Alek-C, c'est pas mal aussi comme méthode je viens de tester c'est pas mal.

    Après l’exécution sur un gros fichier prend presque 1 minute.
    Alors qu'avec l'autre code c'est 1 seconde.

    Mais merci pour la technique

  3. #23
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alek-C Voir le message
    je voulais proposer une seconde approche : en fait, ce que je comprends, c'est qu'il faut récupérer les chaines de caractères d'un fichier ; une chaine étant définie par un texte entre guillemets sur une ou plusieurs lignes, une ou plusieurs fois par ligne

    en gros, cela revient à dire qu'on alterne des séquences d'affichage (après le premier guillemet) et de non affichage (après le suivant), etc.

    du coup, je suis parti sur un programme qui va découper les données en entrées en fonctions des guillemets, et afficher un élément sur deux ensuite

    un petit exemple vaut mieux qu'un long discours

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    use strict;
    use warnings;
     
    open my $fh, 'ex.txt';
     
    # flag sert a alterner les chaines
    my $flag=0;
    # str est utilise pour construire la chaine de travail
    my $str='';
     
    # lecture du fichier en sautant les cas particuliers Left/Top...
    while (<$fh>) {
    	next if (/^\s*(?:Left|Top|Width|Height):/);
    	# supression des sauts de lignes et des espaces multiples (pour faire joli uniquement)
    	chomp;
    	s/\s+/ /g;
    	# construction d'une chaine globale de toutes les lignes "intéressantes"
    	$str.=$_;
    }
    # fin d'utilisation du fichier
    close $fh;
     
    #découpage de la chaine par les caractères "
    my @elts=split /"/, $str;
     
    #boucle sur le tableau pour n'en garder qu'un sur deux
    foreach (@elts) {
    	print "$_\n" if $flag;
    	#inversion du flag pour garder un élément sur deux
    	$flag=$flag?0:1;
    }
    Résumé :
    Le programme lit tout le fichier et saute les lignes qui posent problème.
    Il concatène tout le fichier dans une seule chaine en virant les sauts de lignes et en simplifiant les espaces (ça, c'est juste pour faire plus joli)
    Une fois le fichier lu, la chaine générée est découpée en fonction des guillemets et placées dans un tableau.
    Il ne reste qu'à afficher un élément sur deux du tableau...

    Si le fichier est correct (qu'il ne manque pas de guillemets), ça doit marcher (j'ai testé sur les exemples ici).
    L'approche est judicieuse, mais elle présente l'inconvénient de monter deux fois l'intégralité le fichier en mémoire, une fois dans une chaîne et une fois dans un tableau.

    Comme je travaille fréquemment sur des fichiers de plusieurs gigaoctets, voire dizaines de gigaoctets, j'évite ce genre de construction. Je préfère itérer, dans la mesure du possible.

  4. #24
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    naturellement, tout dépend de l'application ^^

    on peut vider $str après le split histoire de ne pas le garder en mémoire mais ça ne reste valable que sur des fichiers de taille raisonnable

    le but était juste de suggérer une autre approche qui présente l'avantage d'être un peu plus compacte et à laquelle on ne pense pas forcément assez

    mais évidemment, cela présente des inconvénients :p

  5. #25
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par oliviernouhi Voir le message
    Ok merci pour ces directive je vais analyser cela.
    Si tu es sous Unix, tu peux aussi lancer le script uniligne suivant à la ligne de commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne 'print if /^[^"]+"\s$/;' input.txt
    qui t'affichera les éventuelles lignes ayant des guillemets orphelins en fin de ligne (avec input.txt ton fichier en entrée) et te donnera donc peut-être une piste. Sous dos, je ne sais pas si ça marchera parce qu'il faut remplacer les ' par des " et ça risque d'entrer en conflit avec les guillemets à l'intérieur de l'expression régulière.


    Citation Envoyé par oliviernouhi Voir le message
    Une dernière question après je ne t'embête plus

    Admettons que je veuilles réecrire mon fichier mais SANS les chaines.

    Du coup je vais faire un deuxième open ECRIRE_fichier_sans_chaines
    Et je vais intégrer des print ECRIRE_fichier_sans_chaines
    Ou puis je mettre ça dans mon code ?
    Et comme écrire les lignes sans les chaines trouvés ?
    Hum, vu comment j'ai construit la solution, c'est difficile à faire dans le même script, il faut envisager un deuxième script, bâti sur celui-ci avec quelques modifications ici ou là pour supprimer les chaînes entre guillemets au lieu de les imprimer, avant d'imprimer la ligne dépouillée des chaînes. La solution proposée par Alek-C se prête mieux à ce changement, car une fois le fichier dans un tableau avec des chaînes sans guillemets et des chaînes avec, il suffit d'imprimer le ligne paires dans un fichier et les lignes impaires dans l'autre.

  6. #26
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne 'print if /^[^"]+"\s$/;' input.txt
    qui t'affichera les éventuelles lignes ayant des guillemets orphelins en fin de ligne (avec input.txt ton fichier en entrée) et te donnera donc peut-être une piste. Sous dos, je ne sais pas si ça marchera parce qu'il faut remplacer les ' par des " et ça risque d'entrer en conflit avec les guillemets à l'intérieur de l'expression régulière.
    L'échappement marche parfois aussi sous Windows (pas toujours, mais pour les guillemets, oui)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne "print if /^[^\"]+\"\s$/;" input.txt

  7. #27
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    Ok très bien merci à vous deux.

    Je vais me pencher sur le cas de l'écriture avec ton code Lolo78 parce qu'avec le code d'Alex-C je pense qu'il faut juste rajouter un truc comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach (@chaine_complete) {
    	if ($flag == 1){
    		print ECRIRE_chaines "$_\n" ;
    	}
    	else{
    		print ECRIRE_X7 "$_\n" ;
    	}
    	#inversion du flag pour garder un élément sur deux
    	$flag=$flag?0:1;
    }
    Par contre j'ai plus la mise en forme du fichier à l'origine ^^

    En tout cas merci encore

  8. #28
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    oui, pour avoir dans 2 fichiers distincts, ta proposition devrait marcher

    sinon, pour info, tu peux facilement conserver la mise en forme si tu le souhaites !

    par exemple, tu peux supprimer les commandes "chomp;" et "s/\s+/ /g;" de la première partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (<$fh>) {
    	next if (/^\s*(?:Left|Top|Width|Height):/);
    	# construction d'une chaine globale de toutes les lignes "interessantes"
    	$str.=$_;
    }
    et tu auras la troisième chaine sur 2 lignes avec des tabulations au milieu... vu les exemples, je pensais qu'il fallait tout ramener sur une ligne proprement ^^

  9. #29
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    Oui il faut que je ramène les chaines sur une ligne.

    Mais le fichier faut que je le garde avec la mise en forme.

    Du coup je peux que faire l'un ou l'autre.

    Au pire je vais refaire un traitement sur les résultats que ça me remonte pour supprimer les espaces et tabulations en trop.

    Merci

  10. #30
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    je comprends pas : le fichier n'est pas modifié ici ?!

  11. #31
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 236
    Points : 110
    Points
    110
    Par défaut
    Si si tout est bon.

    J'ai adapté et j'obtiens ce que je veux.

    Tout est niquel !!

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Nettoyer les \n entres des guillemets
    Par rambc dans le forum Général Python
    Réponses: 6
    Dernier message: 11/07/2013, 14h05
  2. Rechercher un string entre des guillemets (Expression régulière)
    Par misswatson dans le forum Débuter avec Java
    Réponses: 27
    Dernier message: 22/04/2013, 14h55
  3. Réponses: 2
    Dernier message: 10/01/2012, 23h28
  4. Récupérer valeur entre des balises script
    Par lirycs78 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/10/2010, 14h07
  5. [C# 1.1] Comment récupérer du texte entre des mots connus ?
    Par foolsky dans le forum Windows Mobile
    Réponses: 8
    Dernier message: 26/04/2006, 14h15

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