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 :

Split d'un fichier entre 2 patterns


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Split d'un fichier entre 2 patterns
    Bonjour,
    J'ai un fichier texte avec un couple de deux chaines de caracteres qui apparait à plusieurs reprises.
    En fait je voudrais "splitter" ce fichier texte en plusieurs sous fichiers avec pour chaines de début et de fin de chaque sous fichier les 2 patterns.
    Je débute et je n'ai pas bien vu comment je pouvais utiliser au mieux la fonction split dans mon cas.
    Par avance merci de toute aide.

  2. #2
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Ça dépend ce que tu veux faire. Tu peux poster un petit exemple de données, pour avoir une idée ?

    N

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Le fichier est de cette forme :

    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
    ...
    xxx
    begin
    xxx
    ...
    xxx
    end
    xxx
    ...
    xxx
    begin
    xxx
    ...
    xxx
    end
    xxx
    ...
    Et j'aimerais :
    sous fichier 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
    xxx
    ...
    xxx
    end
    sous fichier 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
    xxx
    ...
    xxx
    end

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est pas encore ultra-clair... On jette tout ce qui ne se trouve pas entre un begin et un end consécutifs ?

    Le plus simple est encore de faire une petite machine à état :
    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
     
    my $i = 0;
    my $p = 0;
    my $fout = "Fichier_";
    my $fhout;
    while( <INPUT> ){
      if( /^begin\s*$/ ){
        $i++; $p = 1;
        open $fhout, '>', $fout.$i or die "Can't open $fout$i : $!\n";
      }
      if( $p ){
        print $fhout $_;
      }
      if( /^end\s*$/ ){
        $p = 0; close $fhout;
      }
    }
    Ce code devra être adapté s'il risque d'y avoir des emboîtements (ce que tu n'as pas précisé non plus).

    --
    Jedaï

  5. #5
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Je me disais que tes données pourrait avoir une gueule comme ça. En ce cas, tu peux utiliser le fabuleux opérateur ... comme suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #! /usr/local/bin/perl
     
    my $part = 0;
     
    while( <> ) {
        if( /^begin/ ... /^end/ ) {
            if( /^begin/ ) {
                my $file = sprintf('part-%04d', ++$part);
                open OUT, '>', $file or die "Ne peut ouvrir $file en sortie: $!\n";
            }
            print OUT;
        }
    }
    C'est pas tous les jours qu'on a la chance, mais c'est un chouette opérateur.

    N

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Cool ! Je l'avais oublié celui-là (faut dire qu'on ne s'en sert pas tous les jours, ). Néanmoins toujours la même recommandation : ne pas utiliser ce code en cas d'emboîtement.

    Du coup avec ton code on peut en faire un uniligne honorable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne "if(/^begin/ ... /^end/){open O,sprintf('part-%04d', ++$p) if /^begin/;print O}"  Mon_fichier_à_découper
    --
    Jedaï

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #! /usr/local/bin/perl
     
    my $part = 0;
     
    while( <> ) {
        if( /^begin/ ... /^end/ ) {
            if( /^begin/ ) {
                my $file = sprintf('part-%04d', ++$part);
                open OUT, '>', $file or die "Ne peut ouvrir $file en sortie: $!\n";
            }
            print OUT;
        }
    }
    Merci.
    Mais j'aurais quelques questions (de débutant) :
    1- à quel moment je spécifie le fichier sur lequel je vais appliquer mon script perl (je suppose que qd je le lance, je fais toto.pl fichier.txt mais je n'en suis pas sûr, et comme ca ne marche pas je ne sais pas d'où vient mon erreur).
    2- Je sens qu'il va falloir que j'apprenne les expressions régulières car mon begin est de la forme : Toto: TITI (de même que mon end) et je pense que : if(/^Toto: TITI/ ... ca ne marche pas
    3- Que fait l'instruction : sprintf('part-%04d', ++$part)
    4- Qu'appeles-tu "fabuleux opérateur" ?
    Encore merci.
    Thomas

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    up merci

Discussions similaires

  1. Partage des fichiers entre projets Eclipse
    Par laura_cornel dans le forum Eclipse Java
    Réponses: 9
    Dernier message: 11/12/2006, 11h52
  2. Réponses: 7
    Dernier message: 10/07/2006, 17h33
  3. [Système] problème de copie de fichier entre 2 serveurs
    Par HOUDEBINE dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2006, 16h13
  4. [win] problème pour partager des fichiers entre 2 pc
    Par goma771 dans le forum Administration
    Réponses: 1
    Dernier message: 01/12/2005, 16h15
  5. Partage de fichier entre Linux et Mac
    Par maddog2032 dans le forum Réseau
    Réponses: 3
    Dernier message: 14/04/2005, 08h32

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