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

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    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 éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    il manque un point-virgule après ton counter++, erreur de recopie ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    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é).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    C'est à peu de chose près, la même solution que la mienne.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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
    Points : 12 469
    Points
    12 469
    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 habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    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
    Points : 12 469
    Points
    12 469
    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