7935 sujets

Développement web côté serveur, CMS

Hello ! Smiley smile

Je souhaite supprimer les doublons d'adresse mail d'un fichier Csv importé via un input-type file,

Je peut récupérer le fichier csv et le lire ligne par ligne

Ce que je voudrais c est repérer les doublons pour ensuite les supprimer de mon fichier, le sauvegarder et le retourner a l'utilisateur une fois traité Smiley smile

Mais voila je bloque je n'ai rien trouver sur les forum qui correspond vraiment a mon soucie, j ai fait une requête EGAL mais ça ne fonctionne pas ..



Si quelqu'un a déjà était dans cette situation et souhaite me prêter main forte ça serais génial !

Merci Smiley biggrin


        <form name="upload" method="post" action="index.php?nav=Traitement.php" enctype="multipart/form-data" class="form-desabo">
            <div class="row desabo-row">
                <div class="col-md-12 col-md-offset-3 center desabo-container">
                    <label for="sepateur">Choisissez le separateur ( , / ; - ..)</label><br>
                    <input type="text" name="separateur" id="separateur"><br>
                    <label for="sepateur">Choisissez le delimiteur ( " [ ] ; - ..)</label><br>
                    <input type="text" name="delimiteur" id="delimiteur"><br>
                    <label for="ignore">Nombre de ligne à ignorer</label>
                     <select name="ignore" id="ignore">
                        <option value="0">0</option>
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4">4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                        <option value="8">8</option>
                        <option value="9">9</option>
                        <option value="10">10</option>
                        <option value="11">11</option>
                        <option value="12">12</option>
                        <option value="13">13</option>
                        <option value="14">14</option>
                        <option value="15">15</option>
                    </select><br>
                    <label for="import">N° champ a importer</label>
                    <select name="import" id="import">
                        <option value="0">0</option>
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4">4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                        <option value="8">8</option>
                        <option value="9">9</option>
                        <option value="10">10</option>
                        <option value="11">11</option>
                        <option value="12">12</option>
                        <option value="13">13</option>
                        <option value="14">14</option>
                        <option value="15">15</option>
                    </select>
                        <h1 class="imgupload"><i class="fa fa-file-image-o"></i></h1>
                        <h1 class="imgupload ok"><i class="fa fa-check"></i></h1>
                        <h1 class="imgupload stop"><i class="fa fa-times"></i></h1>
                        <p id="namefile">Accepte les .txt /.csv </p>
                        <button type="button" id="btnup" class="btn btn-primary btn-lg">Posez-le ici!</button>
                        <input type="file" value="" name="fileup" id="fileup">
                        <input type="submit" value="Submit!" class="btn btn-primary" id="submitbtn">
                    <button type="button" class="btn btn-default" disabled="disabled" id="fakebtn">Envoyer <i class="fa fa-minus-circle"></i></button>
                </div>
            </div>
                     
             
        </form>
    </div>
</div>
<?php
// Vérifie si la chaine ressemble à un email
//if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
//    echo 'Cet email est correct.';
//} else {
//    echo 'Cet email a un format non adapté.';
//}
 
 
$dossier = 'upload/'; //* Je crée un dossier pour herberger mes fichier temporaire
$fichier = basename($_FILES['fileup']['name']);
$taille_maxi = 200000;
$taille = filesize($_FILES['fileup']['tmp_name']);
$extensions = array('.csv', '.txt'); //*Je crée mes extentions
$extension = strrchr($_FILES['fileup']['name'], '.');
$import=$_POST['import'];
$ignore=($_POST['ignore']);
$delimiter = $_POST['delimiteur'];
$separateur = $_POST['separateur'];
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = '';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
    //On formate le nom du fichier ici...
    $fichier = strtr($fichier,
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
      
    if(move_uploaded_file($_FILES['fileup']['tmp_name'], $dossier . $fichier)){
 
            // Je lis mon fichier csv
            $row = 1;  
            if (($handle = fopen("upload/".$fichier, "r")) !== FALSE) {
                while (($data = fgetcsv($handle, 1000, $separateur, $delimiter)) !== FALSE) {
                    if ($row > $ignore){
                         
                        $num = count($data); 
 
                        if ($data[$import] == filter_var($data[$import], FILTER_VALIDATE_EMAIL)){ //Je filtre les mail si le mail est ok alors je lance la requete
                             
                            $requette = $db->prepare("SELECT * FROM `hardbounce_projet` WHERE `hardbounce_email` = '".$data[$import]."' ");
                            $requette->execute();
                            $resultat = $requette->fetchAll();
                            echo '<pre>';
                            print_r($resultat);
                            echo '</pre>';
 
                        } else {
                            echo "";
                        }
                         
                    }
                        echo "";
                        $row++;
 
                        for ($c=0; $c < $num; $c++) {
//                            echo $data[$c] . "<br />\n";
                    }
                }
                fclose($handle);
            }
  echo '<div class="container-fluid">'
            . '<div class="row">'
            . '<div class="col-lg-12 sucess_envoi">'
            . '<span class="">Upload effectué avec succès!</span><span class="btn-liste"><a href="index.php?nav=ListeHardbounce.php"> Voir la liste </a></span>'
            . '</div>'
            . '</div>'
       .'</div>';
     
     
    }else{
          echo '<span class="echec_envoi">Echec de l\'upload !</span>';
     }
        
}
else
{
     echo $erreur;
}
 
 
?>
salut,

rien de plus simple, dans ta base précise que le champs mail doit avoir une clé "unique" et le tour est joué Smiley cligne
Si je comprends bien tu aurais un fichier CSV uniquement avec une colonne ET que des adresses mail?

Car si c'est le cas tu n'as même pas besoin de BDD.
je ferai ainsi:
(à tester j'ai pas mon éditeur sous la main )


    if(move_uploaded_file($_FILES['fileup']['tmp_name'], $dossier . $fichier)){
 
            // Je lis mon fichier csv
            $row = 1;  
            if (($handle = fopen("upload/".$fichier, "r")) !== FALSE) {
                while (($data = fgetcsv($handle, 1000, $separateur, $delimiter)) !== FALSE) {
                    if ($row > $ignore){
                         
                       $num = count($data); 
                       $mailsList = []; //Liste des adresses mails
                        if ($data[$import] == filter_var($data[$import], FILTER_VALIDATE_EMAIL))
                        { //Je filtre les mail si le mail est ok alors je lance la requete
                            $mailsList = ($data[$import]);     
                    }
                        $row++;
                }
             $uniqueMailLimit = array_unique($mailsList);
             var_dump($uniqueMailLimit);
            } 


Le lien vers la doc php php array_unique
Modifié par biduletruck (16 Nov 2018 - 12:47)
Merci pour vos réponse ca fait plaisir ! Smiley smile
Je vais tester ton code, pour supprimer le doublons du CSV et le retourne a l utilisateur tu a une piste sur laquelle me mettre ? Smiley smile
Le plus simple, à partir du filtrage ($uniqueMailLimit) tu regénères un CSV et du le download automatiquement.

par exemple tu fais un bouton pour le téléchargement et du envoi ta variable à une autre page pour faire le traitement du csv afin de ne pas avoir de problème de formatage du fichier d'export.
Modifié par biduletruck (16 Nov 2018 - 14:05)
comme je ne peux pas le tester de mon côté (pour le moment) c'est pas évident.

sinon il y a surement un pb à cette ligne
 $mailsList = ($data[$import]); 


peux être quelques chose comme ça
$mailsList[] = $data[$row];


Pour indiquer la ligne à ajouter à $mailsList

Mais dans le principe:

1 - tu tests si la l'adresse mail est OK
2 - SI OK tu l'ajoutes au tableau de valeur $mailsList même si doublon
3 - du dédoublonnes le tableau une fois tout le fichier parcouru
Modifié par biduletruck (16 Nov 2018 - 14:35)
l'erreur te dis que pour array_unique tu lui envoie un string:
$uniqueMailLimit = array_unique($mailsList);


$mailsList est donc un string, et pas un array. donc cela ne peux pas marcher.
en remplaçant
$mailsList = $valeurAjoute; 
par
$mailsList[] = $valeurAjoute  
dans la boucle, ça devrait le faire.
leacode22 a écrit :
Huuuum d'accord et si je ne peut pas faire avec array_unique quelle solution s offre a moi ? Smiley decu


voila. c'est là le problème lol

c'est pas au code à s'adapter à toi, c'est à toi à t'adapter au code, si array_unique (ou autre) e fonctionne pas avec ce que tu as fait, il faut pas aller chercher ailleurs, il faut modifier ce que tu as fait pour t'adapter à array_unique (ou autre). réinvente pas la roue ! c'est trop long crois moi je l'ai fais.
Tu as toujours le même problème : tu fais plusieurs fois la même préparation.

Sinon tu nous parles d'un doublon d'affichage mais le code que tu nous montres n'affiche rien non ?
Modifié par Julien Royer (06 Jan 2019 - 19:14)