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 PHP Discussion :

Supprimer lignes vides fichier texte


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut Supprimer lignes vides fichier texte
    Bonjour,

    Voici un petit bout de code pour testé les domaines emails :

    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
    set_time_limit(0);
     
    $file = "email.txt";
     
    $filestring = file_get_contents($file); // Lit le fichier
    $filearray = explode("\n", $filestring); // Split
     
    $filearray = array_unique($filearray);  // supprime les doublons
    $filearray = array_values(array_filter($filearray)); // supprime elements vides + ré-indexe
     
    $i=0;
    foreach($filearray as $email)
    {
    	if($i >= 100) break; // Nbr d'element à traiter
     
    	preg_match('#@(.*)#i',$email, $matches); // Capture le domaine email
     
    	if(!checkdnsrr($matches[1])) // Test le domaine email
    	{
    		// Supprime les emails don le domaine renvoie FALSE
    		file_put_contents($file, preg_replace("#((.*)@$matches[1])#i", "", file_get_contents($file)));		
    	}
     
    	$i++;
    }
     
    unset($filearray);
    unset($email);
    J'ai un souci au niveau de la gestion des lignes vides, je n'arrive pas à les supprimer...

    merci pour votre aide

    Cdlt

  2. #2
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    En utilisant la fonction file() qui lit le fichier et renvoie le résultat dans un tableau.

    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $filestring = file_get_contents($file); // Lit le fichier
    $filearray = explode("\n", $filestring); // Split
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $filearray = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $filestring = file_get_contents($file); // Lit le fichier
    $filearray = explode("\n", $filestring); // Split
    ca revient a faire file... utilise le flag FILE_SKIP_EMPTY_LINES

  4. #4
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    merci j'avais oublier ses paramètres, cependant j'ai oublier de précisé que c'est à l'écriture que ca me pause problème ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_put_contents($file, preg_replace("#((.*)@$matches[1])#i", "", file_get_contents($file)));

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    faut créer un nouveau fichier a chaque fois

  6. #6
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    re,

    ah je m'en douter...


    Merci

  7. #7
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    L'idéal étant d'accéder une seule fois au fichier en écriture, on pourrait faire..
    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
    $i=0;
    foreach($filearray as $email)
    {
    	if($i >= 100) break; // Nbr d'element à traiter
     
    	preg_match('#@(.*)#i',$email, $matches); // Capture le domaine email
     
    	if(!checkdnsrr($matches[1])) // Test le domaine email
    	{
    		$filearray[$i]=''; // Supprime les emails du tableau dont le domaine renvoie FALSE
    	}
     
    	$i++;
    }
    file_put_contents($file,implode("\n",$filearray));

  8. #8
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    merci Eric2a, je test ton code ...

  9. #9
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Bon finalement ça ne va pas il me supprime des emails dont le domaine est valide ex: hotmail.fr, yahoo.fr, etc ...

    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
    $file = "email.txt";
     
    $filestring = file_get_contents($file,FILE_SKIP_EMPTY_LINES);
    $filearray = explode("\n", $filestring);
     
    $filearray = array_unique($filearray);  // supprime les doublons
    $filearray = array_values(array_filter($filearray)); // réindexe
     
    $i=0;
    foreach($filearray as $email)
    {
    	if($i >= 10000) break; // Nbr d'element à traiter
     
    	preg_match('#@(.*)#i',$email, $matches); // Capture le domaine email
     
    	if(!checkdnsrr($matches[1])) // Test le domaine email
    	{
    		$filearray[$i]=''; // Supprime les emails du tableau dont le domaine renvoie FALSE
    	}
     
    	$i++;
    }
    file_put_contents($file,implode("\n",$filearray));
     
    unset($filearray);
    unset($email);
    Quelque chose m'échappe

  10. #10
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $filearray = file($file, FILE_SKIP_EMPTY_LINES);
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $filestring = file_get_contents($file,FILE_SKIP_EMPTY_LINES);
    $filearray = explode("\n", $filestring);
    Sinon tente à nouveau avec ce code...
    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
    <?php
    $file='email.txt'; 
     
    $filearray=file($file, FILE_SKIP_EMPTY_LINES);
     
    $filearray=array_unique($filearray);			// supprime les doublons
    $filearray=array_values(array_filter($filearray));	// réindexe
     
    $i=0;
    foreach($filearray as $email){
    	if($i>=10000)break; // Nbr d'element à traiter
     
    	$good=false;
    	// Capture le domaine email pour tester sa validité
    	if(preg_match('#@(.*)#i',$email, $matches))$good=(checkdnsrr($matches[1]));
     
    	if(!$good)$filearray[$i]=''; // Supprime les emails du tableau dont le domaine est invalide
    	$i++;
    }
    file_put_contents($file,implode("\n",$filearray));
     
    unset($filearray);
    unset($email);
    ?>

  11. #11
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Re,

    Au premier parse du fichier il me retire pas mal email erronée MAIS si je rafraichi/ re parse le fichier alors il me reste plus aucune email (fichier vide) ...

    Je me demande si il faudrait pas écrire dans un nouveau fichier plutôt ...

    édit: le code modifié selon tes conseils ...

    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
    $file='email.txt'; // 80 000 emails à vérifier
     
    $filearray=file($file, FILE_SKIP_EMPTY_LINES);
     
    $filearray=array_unique($filearray);			// supprime les doublons
    $filearray=array_values(array_filter($filearray));	// réindexe
     
    $i=0;
    foreach($filearray as $email){
    	if($i>=10000)break; // Nbr d'element à traiter
     
    	$good=false;
    	// Capture le domaine email pour tester sa validité
    	if(preg_match('#@(.*)#i',$email, $matches))$good=(checkdnsrr($matches[1]));
     
    	if(!$good)$filearray[$i]=''; // Supprime les emails du tableau dont le domaine est invalide
    	$i++;
    }
    file_put_contents($file,implode("\n",$filearray));
     
    unset($filearray);
    unset($email);

  12. #12
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Je ne vois pas pourquoi

    La fonction array_filter() est-elle vraiment utile ici ?

    Et si on remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $filearray=array_values(array_filter($filearray));	// réindexe
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $filearray=array_values($filearray);	// réindexe
    ?


    Sinon, comme l'a dit Stealth35,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    faut créer un nouveau fichier a chaque fois

  13. #13
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    re,

    La fonction filter permet avec array_values de supprimer les items vide de l'array et de le ré indexé ...

  14. #14
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Oups, je viens de remarquer que je fait x test sur les mêmes domaines email car quand je fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $filearray=array_unique($filearray);
    C'est sur l'email entier que je cherche les doublons et nom sur le domaine de l'email...

  15. #15
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Re,

    La fonction array_filter n'est pas nécessaire car le tableau renvoyé par la fonction file() ne contient aucune ligne vide (graçe à l'option FILE_SKIP_EMPTY_LINES).

    Le code ci-dessous ne teste qu'une fois un même domaine reconnu comme étant valide.
    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
    <?php
    $file='email.txt';
    $file=dirname(__FILE__).DIRECTORY_SEPARATOR.'email.txt';
     
    $filearray=file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
     
    $filearray=array_unique($filearray);	// supprime les doublons
    $filearray=array_values($filearray);	// réindexe
     
    $domainearray=array();
    $i=0;
    foreach($filearray as $email){
    	if($i>=10000)break; // Nbr d'element à traiter
     
    	$good=false;
    	if(preg_match('#@(.+)$#',$email,$matches)){
    		$domaine=strtolower($matches[1]);
    		$good=(in_array($domaine,$domainearray));
    		if(!$good){
    			$good=(checkdnsrr($domaine));
    			if($good)$domainearray[]=$domaine;
    		}
    	}
    	if(!$good)$filearray[$i]=''; // Supprime les emails invalides du tableau
    	$i++;
    }
    file_put_contents($file,implode("\n",$filearray));
     
    unset($domainearray);
    unset($filearray);
    unset($email);
    ?>

  16. #16
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    MERCI Eric2a pour ton aide ...

    J'ai donc tester ton code mais il me trouve aucun domaine email non valide ...

    Sinon :

    Le code ci-dessous ne teste qu'une fois un même domaine reconnu comme étant valide.
    est exactement ce que je cherche à faire depuis 14h ...


    Edit: Je n'ai pas saisi la comparaison ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $good=(in_array($domaine,$domainearray));
    Car $domainearray est vide si je me trompe pas ...

  17. #17
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    il me trouve aucun domaine email non valide
    C'est étrange...
    J'ai testé sur un fichier contenant de fausses adresse email (domaines inexistants et chaines ne correspondant pas à des adresses email). Le code a bien "rejeté" ces lignes.

    $domainearray est vide si je me trompe pas
    Initialement le tableau $domainearray (déstiné à contenir les domaines valides) est bien vide. La variable $good sera bien égale à false la première fois, ce qui fait éxecuté le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!$good){
    	$good=(checkdnsrr($domaine));
    	if($good)$domainearray[]=$domaine;
    }
    Là, si le domaine est valide (checkdnsrr($domaine) renvoie True), il sera ajouté dans le tableau $domainearray. Ainsi (pour ce même domaine) avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $good=(in_array($domaine,$domainearray));
    $good sera égal à true, évitant ainsi un nouvel appel à la fonction checkdnsrr().

  18. #18
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Bonjour Eric2a,

    j'ai beau testé ton code cela ne marche pas...

    Je t'envoie en MP un échantillon de 40 000 email (don le préfixe email a été modifié/confidentialité) pour que tu puisse constaté le problème du traitement avec un fichier volumineux ...

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    faut bosser en stream avec des fichier temporaire sinon ca va prendre beaucoup de memoire

  20. #20
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    J'ai donc réussi codé quelques choses de fonctionnelle ...

    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
    set_time_limit(0);
     
    function parse_domain_email($str) {							
        $result = explode("@",$str);
    	return trim($result[1]);
    }
     
    $file = "email.txt";
    $filearray = file($file, FILE_SKIP_EMPTY_LINES);  	
     
    $array_parse = array_map('parse_domain_email',$filearray);	// Cherche le domaine email de chaque item
    $array_unique=array_unique($array_parse);					// Supprime les doublons
    $array_clean=array_values(array_filter($array_unique));		// Supprime les items vides et réindexe l'array	
    shuffle($array_clean);										// Mélange les items de l'array
     
    $i=0;
    $cpt=0;
    foreach($array_clean as $domain_email){						
    	if($i >= 200) break;									// limite pour la mémoire					
    	if(!checkdnsrr($domain_email)){
    		file_put_contents($file, preg_replace("#((.*)@$domain_email$)#i", "", file_get_contents($file)));		 
    		$cpt++;
    	}
    	$i++;
    }
     
    unset($array_clean);
    unset($domain_email);
    echo $cpt.' domain invalid found - <a href="">Rafraichir</a>';
    A cause de la quantité de mémoire utilisé et du fichier volumineux à traiter le script bug, je limite donc le nombre d'élément de l'array à traiter puis j'utilise shuffle pour ne pas traiter toujours les mêmes éléments + rafraichissement de la page ...

    Ce n'est pas tres propre mais cela marche pour l'instant ...

    @stealth35 Je vois pas comment tu veut faire ...

Discussions similaires

  1. Supprimer ligne vide d'un fichier .txt
    Par Stagiette dans le forum C#
    Réponses: 6
    Dernier message: 26/01/2010, 17h11
  2. supprimer ligne de fichier xml
    Par wajdiisi2007 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 22/08/2007, 17h09
  3. Supprimer lignes dans fichier texte
    Par dr_octopus74 dans le forum VBScript
    Réponses: 1
    Dernier message: 20/02/2007, 17h54
  4. Retour A La Ligne dans fichier texte /?
    Par Phoenix_Blue dans le forum C++Builder
    Réponses: 3
    Dernier message: 19/01/2007, 15h34
  5. ecrire a la ligne dans fichier texte.
    Par zulot dans le forum Langage
    Réponses: 7
    Dernier message: 12/09/2006, 12h02

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