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 :

découpage de fichier texte en plusieurs fichiers texte


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 16
    Points
    16
    Par défaut découpage de fichier texte en plusieurs fichiers texte
    Bonjour. je suis novice en perl et j'apprends à faire des manipulations sur des fichiers. J'ai un fichier que j'aimerais découper en plusieurs autres. Vous comprendrez mieux avec l'exemple.

    fichier.txt :

    CANDIDAT BZ0AH2 SDFFSSD
    VOTE FSDFDD FDSFDGG
    VOTE DSFDFD ZFDFGTR
    CANDIDAT BN38KU YTHUUHG
    VOTE ADZRTU FHYGRYY
    CANDIDAT DGBUYIH FHGFBBH
    VOTE DGGFHH HGFNGHU
    VOTE GJB23BJ FHJBHUU
    VOTE AZRT99 16GG583
    VOTE DGGG89 MARS111

    Ce qu'il me faudrait en fait c'est qu'à chaque fois que j'ai une ligne qui commence par CANDIDAT, je crée un nouveau fichier que je nommerais par exemple CANDIDATX.txt (avec X un compteur). Au final, j'aimerais me retrouver avec 3 fichiers selon l'exemple donné. Mes fichiers seraient comme suit :

    CANDIDAT1.txt :

    CANDIDAT BZ0AH2 SDFFSSD
    VOTE FSDFDD FDSFDGG
    VOTE DSFDFD ZFDFGTR

    CANDIDAT2.txt :

    CANDIDAT BN38KU YTHUUHG
    VOTE ADZRTU FHYGRYY

    CANDIDAT3.txt :

    CANDIDAT DGBUYIH FHGFBBH
    VOTE DGGFHH HGFNGHU
    VOTE GJB23BJ FHJBHUU
    VOTE AZRT99 16GG583
    VOTE DGGG89 MARS111

    Esque quelqu'un saurait comment faire ça en perl? merci de votre aide

  2. #2
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Points : 322
    Points
    322
    Par défaut
    Une méthode simple :
    Tu parcours ton fichier source ligne par ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    open(F,"<./source") or die ("...");
    while(defined(my $ligne = <F>)) {
    }
    close(F);
    A chaque ligne contenant "CANDIDAT", tu ouvres un descripteur sur un nouveau fichier candidat_i.txt. Tu peux utiliser une variable que tu incrémentes à chaque fois pour fixer i.
    Ce qui donnerai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if($ligne=~/CANDIDAT/) {
      close(CDT) if fileno(CDT);
      open(CDT,"./candidat_".$i.".txt") or die("...");
      ++$i;
    }
    La routine fileno() permet de tester que ton descripteur existe avant de le fermer (et donc éviter une erreur flagrante).

    Il ne te reste plus qu'à écrire les lignes dans le fichier pointé par le descripteur CDT.

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Cadeau :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $candidat_fichier = 'candidat.txt';
    open my $fh_candidat, '<', $candidat_fichier or die "Impossible de lire $candidat_fichier\n";
    my $compteur             = 0;
    my $nom_fichier_resultat = 'resultat_';
    my $fichier_resultat     = $nom_fichier_resultat . "$compteur.txt";
     
    print "Creation $fichier_resultat\n";
    open my $fh_resultat, '>', $fichier_resultat or die "Impossible d'ecrire $fichier_resultat\n";
    while ( my $ligne = <$fh_candidat> ) {
      if ( $ligne =~ m{^CANDIDAT} ) {
        close $fh_resultat or die "Impossible de fermer $fichier_resultat\n";
        $compteur++;
        $fichier_resultat = $nom_fichier_resultat . "$compteur.txt";
        print "Creation $fichier_resultat\n";
        open $fh_resultat, '>', $fichier_resultat or die "Impossible d'ecrire $fichier_resultat\n";
      }
     
      # Ecriture dans le fichier résultat
      print {$fh_resultat} $ligne;
    }
    close $fh_candidat or die "Impossible de fermer $candidat_fichier\n";
    close $fh_resultat or die "Impossible de fermer $fichier_resultat\n";

  4. #4
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Points : 322
    Points
    322
    Par défaut
    Etonnant : j'ai écrit le même script ligne pour ligne( en un peu moins explicite tout de même).
    Ceci voudrait dire que je commence à devenir compétent en Perl ?

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    C'est un bon début

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    Bonjour et merci pour ce script, c'est exactement ce que je voulais faire....merci à vous 2. faudrait que je m'y mette un pe plus.tu te formes dans le tas dimitri ou t'utilises un truc spécial?

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Merci cliquer sur résolu si c bon

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    D'accord, je mettrais résolu dès que j'en aurais fini. ça un truc qui me dérange néanmoins sur le script. après découpage, le premier fichier crée est toujours vide. exemple : si je dois avoir 3 fichiers après exécution du script, j'en ai 4 avec le 4ème vide de taille. bizar...

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    Aussi,
    le script ne marche que pour un fichier donné. J'aimerais qu'il marche pour n'importe quel fichier que je lui donne. Comment faire?

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Je pense que nous vous avons déjà donné un programme qui vous permettra d'avancer. Alors, essayer déjà de comprendre le programme et de l'adapter à vos besoins car pour le moment, vous n'avez rien proposé.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    je pense que ça fonctionne comme ça.

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
     
    if (length($ARGV[0]) eq 0) 
    {
    	die "Le fichier entrant n'existe pas!";
    } 
     
    #my $candidat_fichier = 'candidat.txt';
    open my $fh_candidat, '<', $ARGV[0] or die "Impossible de lire $ARGV[0]\n";
    my $compteur             = 0;
    my $nom_fichier_resultat = 'resultat_';
    my $fichier_resultat     = $nom_fichier_resultat . "$compteur.txt";
     
    print "Creation $fichier_resultat\n";
    open my $fh_resultat, '>', $fichier_resultat or die "Impossible d'ecrire $fichier_resultat\n";
    while ( my $ligne = <$fh_candidat> ) {
      if ( $ligne =~ m{^CANDIDAT} ) {
        close $fh_resultat or die "Impossible de fermer $fichier_resultat\n";
        $compteur++;
        $fichier_resultat = $nom_fichier_resultat . "$compteur.txt";
        print "Creation $fichier_resultat\n";
        open $fh_resultat, '>', $fichier_resultat or die "Impossible d'ecrire $fichier_resultat\n";
      }
     
      # Ecriture dans le fichier résultat
      print {$fh_resultat} $ligne;
    }
    close $fh_candidat or die "Impossible de fermer $ARGV[0]\n";
    close $fh_resultat or die "Impossible de fermer $fichier_resultat\n";
    Le script marchera avec tous les fichiers que je mettrais en paramètre lors de l'exécution.

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

Discussions similaires

  1. Récupérer textes dans plusieurs fichiers RTF sans les ouvrir
    Par jpvba65 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/01/2014, 17h13
  2. Couper un fichier texte en plusieurs fichiers texte
    Par Wim88 dans le forum Général Java
    Réponses: 2
    Dernier message: 30/12/2013, 00h57
  3. [OpenOffice] Recherche texte dans plusieurs fichiers
    Par robv dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 13/12/2010, 19h56
  4. Réponses: 10
    Dernier message: 27/02/2009, 17h19
  5. Générer plusieurs fichiers à partir d'un fichier excel
    Par yas2006 dans le forum Documents
    Réponses: 3
    Dernier message: 02/06/2006, 17h54

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