Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2011, 15h58   #1
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
Par défaut Supprimer lignes vides fichier texte

Bonjour,

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

Code :
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
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h07   #2
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
Salut,

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

Remplacer
Code :
1
2
$filestring = file_get_contents($file); // Lit le fichier
$filearray = explode("\n", $filestring); // Split
par
Code :
$filearray = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h08   #3
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Code :
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/01/2011, 16h09   #4
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
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 :
file_put_contents($file, preg_replace("#((.*)@$matches[1])#i", "", file_get_contents($file)));
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h11   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
faut créer un nouveau fichier a chaque fois
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h13   #6
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
re,

ah je m'en douter...


Merci
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h51   #7
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
L'idéal étant d'accéder une seule fois au fichier en écriture, on pourrait faire..
Code :
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));
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 17h25   #8
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
merci Eric2a, je test ton code ...
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 17h40   #9
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
Bon finalement ça ne va pas il me supprime des emails dont le domaine est valide ex: hotmail.fr, yahoo.fr, etc ...

Code :
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
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 17h55   #10
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
C'est
Code :
$filearray = file($file, FILE_SKIP_EMPTY_LINES);
et non
Code :
1
2
$filestring = file_get_contents($file,FILE_SKIP_EMPTY_LINES);
$filearray = explode("\n", $filestring);
Sinon tente à nouveau avec ce code...
Code :
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);
?>
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 18h07   #11
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
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 :
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);
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 18h29   #12
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
Je ne vois pas pourquoi

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

Et si on remplace
Code :
$filearray=array_values(array_filter($filearray));	// réindexe
par
Code :
$filearray=array_values($filearray);	// réindexe
?


Sinon, comme l'a dit Stealth35,
Code :
faut créer un nouveau fichier a chaque fois
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 18h32   #13
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
re,

La fonction filter permet avec array_values de supprimer les items vide de l'array et de le ré indexé ...
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 18h39   #14
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
Oups, je viens de remarquer que je fait x test sur les mêmes domaines email car quand je fait ceci :

Code :
$filearray=array_unique($filearray);
C'est sur l'email entier que je cherche les doublons et nom sur le domaine de l'email...
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 20h40   #15
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
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 :
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);
?>
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 20h53   #16
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
MERCI Eric2a pour ton aide ...

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

Sinon :

Citation:
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 :
$good=(in_array($domaine,$domainearray));
Car $domainearray est vide si je me trompe pas ...
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 22h47   #17
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
Citation:
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.

Citation:
$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 :
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 :
$good=(in_array($domaine,$domainearray));
$good sera égal à true, évitant ainsi un nouvel appel à la fonction checkdnsrr().
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 09h35   #18
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
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 ...
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 10h39   #19
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
faut bosser en stream avec des fichier temporaire sinon ca va prendre beaucoup de memoire
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 17h07   #20
Membre régulier
 
Avatar de la_chouette
 
Inscription : avril 2010
Messages : 114
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 114
Points : 76
Points : 76
Bonjour,

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

Code :
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 ...
la_chouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h11.


 
 
 
 
Partenaires

Hébergement Web