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 de 5000lignes en plusieurs de 200 Lignes


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Par défaut Split d'un fichier de 5000lignes en plusieurs de 200 Lignes
    Bonjour,

    J'ai un fichier de 5000 emails et OVH n'autorise que 200 mails/ heures. J'aimerais donc le découper en plusieurs fichier de 200 Lignes.
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $targetfile = '200_mails.txt';
    my $filename = 'emails.txt';
    #OPEN FILE FOR READING (CHECK FOR FAILURES)
    open ( my $DATA, '<', $filename )  or die "Could not open file '$filename': $!";
     
    while ( my $line = <$DATA> ) {
      my $counter++;
    print "FLAG $counter\n" ;
      #OPEN TARGET FILE  for APPENDING (CHECK FOR FAILURES)
    open (my $FILE, '>>', $targetfile ) or die "Could not open file '$targetfile': $!";
    print $FILE $line;
    close $FILE;
      if ( $counter % 200 == 0) { 
      $targetfile =~ s/200/$counter/;
      }
     
    }
    Je ne sais pas pourquoi ma variable $counter reste toujours à 1 et n'incrémente pas

    Quelqu'un peut m'aider?

    Merci

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    il manque un point-virgule après ton counter++, erreur de recopie ?

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Par défaut
    Merci Gardyen,

    J'ai corrigé avec une petite update dans le problème.
    sans le step $counter cela reste bloqué à 400 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if ($. % 200 == 0) { 
      $targetfile =~ s/200/$./;
      print " FLAG $targetfile \n" ;
      }

    Merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Le problème est que dans ta regexp s///, le motif de recherche est limité à 200 alors que le nom de ton fichier évolue (d'abord 200, puis 400, ...)
    Pourquoi ne pas utiliser plutôt deux variables : une qui comptabilise juste le numéro du fichier, et une construite à partir de ce numéro pour le nom du fichier.
    De même, il n'est pas nécessaire d'ouvrir fermer le fichier à chaque ligne.

    Proposition :

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $targetcounter = 200; 
    my $filename = 'emails.txt';
    #OPEN FILE FOR READING (CHECK FOR FAILURES)
    open ( my $DATA, '<', $filename )  or die "Could not open file '$filename': $!";
     
    my $FILE; 
    while ( my $line = <$DATA> ) {
      if ($. == $targetcounter) {
        undef $FILE;
        $targetcounter += 200;
      }
      if (!$FILE) {
        #OPEN TARGET FILE  for APPENDING (CHECK FOR FAILURES)
        my $targetfile = "$targetcounter_mails.txt";
        open $FILE, '>', $targetfile or die "Could not open file '$targetfile': $!";
      }
      print $FILE $line;
     }
    (je n'ai pas testé).

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Par défaut
    On vient de me passer plusieurs solution sur openstack (désolé mais c'est un projet urgent)

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    open my $rfh,'<','file_5000' or die "unable to open file : $! \n";
     
    my $filecount=0;
    my $wfh;
    while(<$rfh>){
        if(($.-1) % 200 == 0){
               close($wfh) if($wfh);
               open($wfh, '>', sprintf("file%02d", ++$filecount)) or die $!;
            }
       print $wfh "$_";
    }
    Marche très bien mais j'ai compris la ligne avec le modulus "if(($.-1) % 200 == 0){" et mais j'ai toujours du avec ceci: "$_"

    Encore merci.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    C'est à peu de chose près, la même solution que la mienne.

  7. #7
    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
    Billets dans le blog
    1
    Par défaut
    Pour information, réponse à la question d'origine:

    Citation Envoyé par dubis Voir le message
    Je ne sais pas pourquoi ma variable $counter reste toujours à 1 et n'incrémente pas
    Parce qu'en mettant "my $counter" à l'intérieur de la boucle while, ta variable est réinitialisée à 0 (puis incrémentée par le '++') pour chaque ligne lue dans la boucle while.

    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ( my $line = <$DATA> ) {
       my $counter++;
       # ...
    Il aurait fallu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $counter;
    while ( my $line = <$DATA> ) {
       $counter++;
       # ...
    Mais l'utilisation de $. (compteur de ligne) est plus simple.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Par défaut
    Merci ...

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Par défaut
    Citation Envoyé par Lolo78 Voir le message

    Mais l'utilisation de $. (compteur de ligne) est plus simple.
    Ou pourrais je avoir un listing des définitions de $!, $_, $. ?
    J'ai toujours un soucis avec ces raccourcis dont je ne connais pas les noms

    Merci

  10. #10
    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
    Billets dans le blog
    1
    Par défaut
    La doc officielle à jour en anglais: perlvar.

    Ou taper à la ligne de commande de ton ordinateur:
    Doc en français (mais datant un peu): http://perl.mines-albi.fr/DocFr/perlvar.pdf

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

Discussions similaires

  1. Split d'un fichier en plusieurs en fonction d'un motif
    Par moctarim dans le forum Shell et commandes POSIX
    Réponses: 7
    Dernier message: 05/07/2013, 16h11
  2. Réponses: 2
    Dernier message: 22/06/2007, 10h26
  3. Réponses: 7
    Dernier message: 12/02/2007, 11h11
  4. Split d'un fichier pdf
    Par nature dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 19/07/2006, 09h15
  5. Split d'un fichier entre 2 patterns
    Par mirascheat dans le forum Langage
    Réponses: 7
    Dernier message: 17/10/2005, 18h58

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