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 :

Pourquoi mon script n'efface pas les lignes demandées


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 Pourquoi mon script n'efface pas les lignes demandées
    Bonjour,

    Je dois nettoyer une base de liste de mail. J'ai donc le fichier "base_eMAILs" que je dois nettoyer en enlevant les mail qui sont dans le fichier "blacklist_eMAILs_eSAME".
    J'ai donc fait ceci :
    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/env perl 
     
    use strict; 
    use warnings; 
     
    open ( BLACK, "<blacklist_eMAILs" ) or die "unable to open file : $! \n"; 
    my @mail=<BLACK>;
     
    while ( @mail ) {
    	foreach my $mail (@mail){
    	print "FLAG email: $mail\n";
        open ( FILE, "<", "base_eMAILs" ) or die "unable to open file : $! \n"; 
        my @LINES = <FILE>; 
        close( FILE ); 
        open( FILE, ">", "base_eMAILs" ) or die "unable to open file : $! \n";
        foreach my $LINE ( @LINES ) { 
            print FILE $LINE unless ( $LINE =~ m/$mail/ ); 
        } 
        close( FILE ); 
        print( "Email $mail removed.\n" ); 
    	}
    }
    Mes flags fonctionnent mais le fichier base_eMAILs n'est pas modifié. J'ai aussi essayé une substitution par rien comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print FILE $LINE unless ( $LINE =~ s/$mail// );
    Sans succès
    Merci de votre aide.

  2. #2
    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
    Bonjour,
    je ne comprends pas bien l'algo que tu as voulu implémenter, mais il est certainement inadéquat.

    Ouvrir en lecture, puis fermer, puis ouvrir en écriture, puis fermer un fichier au milieu d'une boucle while sur un autre fichier (donc pour chaque ligne de l'autre fichier), ça n'a à peu près aucune chance de marcher.

    Une solution générale pour ce genre de cas:
    - Ouverture du fichier blacklist, lecture complète et stockage dans un tableau ou plus probablement un hachage du contenu de ce fichier, fermeture de ce fichier
    - Ouverture seulement maintenant en lecture du fichier à purger, ouverture d'un second fichier en écriture (autre nom);
    - Lecture ligne à ligne du fichier à purger, écriture dans le fichier de sortie tous les enregistrements à conserver (en fonction du hachage préalablement rempli);
    - fermeture des fichiers en entrée et en sortie, renommage des fichiers pour que le fichier de sortie remplace en définitive le fichier en entrée

    Je ne peux pas entrer plus dans les détails, car tu ne donnes pas de détail. Si tu veux des détails, fournis un échantillon des deux fichiers en entrée et des critères permettant de filtrer les enregistrements à garder ou à écarter.

  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
    Bonjour Lolo,

    Déjà merci de m'avoir répondu...

    Je pensais être prêt de ma solution en agissant ligne par ligne car mes flags fonctionnent c'est à dire qu'ils m'affichent que les adresses mails à effacer. Mais pour répondre à ta question voici un exemple du fichier "base_eMAILs":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fjdjf@acme.org
    jojo@ft.com
    45689@dft.org
    dft@gg.com
    adfr@dft.com
    45698@acme.org
    4djfr@acme.com
    Voici un exemple du fichier "blacklist_eMAILs":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dft@gg.com
    adfr@dft.com
    Dans ce cas en FLAG j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FLAG email: dft@gg.com
    Email dft@gg.com removed.
     
    FLAG email: adfr@dft.com
    Email adfr@dft.com removed.
    Donc l'idée et pour avoir de futur bon résonnement, serait d'effacer les mails qui seraient dans les fichiers "base_eMAILs" et "blacklist_eMAILs", donc de faire 2 tableaux avec les 2 fichiers et les comparer.
    Je suis dépassé.
    Merci.

  4. #4
    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
    En suivant le résonnement des 2 tableaux après quelques recherches motivées, j'ai trouvé ceci :

    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
    #!/usr/bin/env perl 
    use strict; 
    use warnings; 
     
    open ( BLACK, "<blacklist_eMAILs" ) or die "unable to open file : $! \n"; 
    my @bkemails=<BLACK>;
    close (BLACK);
     
    open ( FILE, "<base_eMAILs" ) or die "unable to open file : $! \n"; 
    my @emails = <FILE>; 
    close( FILE ); 
     
    my %bkemails = map +($_ => 1), @bkemails;
    @emails = grep !$bkemails{$_}, @emails;
     
    open ( my $FILE, ">base_eMAILs" ) or die "unable to open file : $! \n";
    print $FILE "@emails";
    close $FILE;
    Cela marche sur mes 2 listes du post ci dessus avant ce dernier. Je testerai tout cela sur mon fichier réel demain.
    Si quelqu'un peut me donner un peut plus d'info sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %bkemails = map +($_ => 1), @bkemails;
    Encore merci.

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par dubis Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my %bkemails = map +($_ => 1), @bkemails;
    @emails = grep !$bkemails{$_}, @emails;
    Si quelqu'un peut me donner un peut plus d'info sur cette ligne :
    sauf erreur, il transforme le tableau @bkemails en tableau associatif %bkemails
    map fait correspondre l'adresse email comme clé et 1 comme valeur systématique pour créer la hashtable
    c'est malin, puisque $_ dans le grep "énumère" les adresses mail une à une, et que du coup $bkemail{adresse@email} existe (ou pas)
    c'est une façon assez astucieuse de faire une intersection de tableaux

  6. #6
    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 pour toute vos réponses mais ...

    Ce qui marche pour les petits fichiers ne fonctionne pas pour les grands. Je viens donc d'appliquer le script sur mon fichier texte de 5000mails avec une "blacklist" de 2000 mails, et la liste des 5000 mails n'est pas modifiée.
    Je me demande donc ou se trouve la limite.

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

Discussions similaires

  1. Mon script ne garde pas les cookies, pourquoi ?
    Par Grimbot dans le forum jQuery
    Réponses: 4
    Dernier message: 30/06/2014, 09h18
  2. Pourquoi mon script ne marche pas ?
    Par chrifus dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/05/2008, 18h04
  3. Pourquoi mon navigateur n'exécute pas les fichiers ASP
    Par Claude_Azoulai dans le forum ASP
    Réponses: 5
    Dernier message: 21/10/2007, 17h25
  4. Pourquoi mon script ne marche pas?
    Par amarcil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/05/2006, 21h37

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