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 :

Récupérer le nom et l'email dans un fichier CSV et modifier le nom des colonnes


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut Récupérer le nom et l'email dans un fichier CSV et modifier le nom des colonnes
    Bonjour.

    J'ai plusieurs fichiers .csv qui ne sont pas disposés de la même façon Mais que je souhaiterais les disposer de façon unique en affichant seulement les Noms et les Emails.

    Exemple:

    Fichier1.csv:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Name, Country, Age, Email-Address
    Alex, France, 22 ans, al@hhh.fr
    Emily, États-Unis, 18 ans, al@kpg.fr
    Jean, Royaume-Uni, 25 ans, al@eerzre.fr
    Yohan, États-Unis, 32 ans, al@mkooju.fr
    Fichier2.csv:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Address Email, Last Name, First Name, Phone
    kjkk@tst.com, Chkk, Willias, 6565898999
    hy@opp.com, Fred, Madson, 5546347656
    oio@ppop.com, Charly, Mark, 9865252222
    kll@kiouk.com, Trsy, Bonifas, 3255666897
    Mais je souhaiterais les convertir de façon à récupérer seulement l'adresse Name dans la première colonne et le Email dans la deuxième colonne exactement comme ceci:

    Résultat (disposition) expéré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Name, Email
    Bill Daruis, opill@yurt.fr
    Tresor Fiacre, trf@uoloo.ci
    Richardson, rch@yyki.com
    1 - Comment donc réussir à convertir n'importe quelle disposition du fichier .csv de façon à présenter dans la 1ère colonne le Name et dans la seconde l'Email ???

    2 - Comment surtout modifier le nom des colonnes d'origine (Exemple: Last Name en Name ou First Name en Name et Adresse Email en Email ou encore Email-Address en Email) ???

    3 - Comment enregistrer ces modifications effectuées toujours en CSV???


    Aidez-moi s'il vous plaît à travers un exemple de code.
    Merci d'avance.

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Voici ce que j'ai fais:

    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
    //Ouverture et lecture du fichier CSV:
    $file = fopen("Fichier1.csv", "r");
     
    //Boucle à travers les colonnes:
    while (($row = fgetcsv($file, 0, ",")) !== FALSE) {
        //Vérifier si le Titre de la colonne qui peut-être "Email Address", ou Address-Email contient le mot "Email" 
        // Puis remplacer le Titre de cette colonne par "Email" tout court.
        // Faire pareil avec la colonne des "Last Name" et "First Name" qu'on devrait remplacer par "Name" tout court:
         if(stripos($row, email) !== false) {
         	$emailRow = str_replace($row, "Email", $row);
         } else if(stripos($row, name) !== false) {
         	$nameRow = str_replace($row, "Name", $row);
         }
    }
    // Ici, je cherche à enregistrer toute les deux colonnes et leurs valeurs avec comme titre "Name" dans la première colonne et "Email" dans la deuxième colonne.
    fputcsv($nameRow, $emailRow);
    fclose($file);
    Je sais que j'ai fais du n'importe quoi, donc je sollicite votre aide.

    Aidez-moi s'il vous plaît.

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Effectivement, il manque des choses

    Je te montre comment je ferais pour Fichier1.csv :

    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
     
    // Paramétrage des fichiers
    $file_source = 'Fichier1.csv';
    $file_destination = 'Fichier1.new.csv';
     
    // Paramétrage des colonnes à récpuérer selon le fichier CSV source
    $nameIndex = 0; // Le nom est dans la 1re colonne de Fichier1.csv (index 0)
    $emailIndex = 3; // Le mail est dans la 4e colonne de Fichier1.csv (index 3)
     
    // Création du fichier de destination
    $fp_destination = fopen($file_destination, 'w');
    fputcsv($fp_destination, ['Name', 'Email'], ',', '"', ''); // Ecriture de l'en-tête
     
    $fp_source = fopen($file_source, 'r');
    $header = fgetcsv($fp_source, 0, ',', '"', ''); // 1re ligne, c'est l'en-tête, on l'ignore
    while ($entry = fgetcsv($fp_source, 0, ',', '"', '')) {
        $name = $entry[$nameIndex];
        $email = $entry[$emailIndex];
        fputcsv($fp_destination, [$name, $email], ',', '"', '');
    }
     
    fclose($fp_source);
    fclose($fp_destination);
    Voilà pour le principe. Prend le temps de bien étudier ceci

    Plus tard tu pourras envisager l'automatisation de la valorisation de $nameIndex et $emailIndex selon les valeurs d'en-têtes du fichier source.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Effectivement, il manque des choses

    Plus tard tu pourras envisager l'automatisation de la valorisation de $nameIndex et $emailIndex selon les valeurs d'en-têtes du fichier source.
    Grand merci pour votre réponse. Mais dans le cas où les colonnes des Fichiers CSV (puisqu'il y a plusieurs fichiers CSV à traiter) n'ont pas les mêmes emplacement des variables $nameIndex et $emailIndex, comment devrais procéder dans ce cas sachant que chaque fichier CSV a sa disposition unique différente d'un autre fichier CSV dont le Name est dans la première colonne ???

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Pour le moment il faut ajuster manuellement.

    Teste le script fourni (je l'ai écrit directment sans test).

    C'est déjà un bon début.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Ça marche très bien. J'ai pu avec succès extraire les nom et email. Mais le souci c'est qu'il me faut le faire à n'importe quel fichier CSV sans préciser au préalable les emplacements de l'email et du nom au niveau des variables $nameIndex et $emailIndex.

    Comment donc procéder à l'automatisation car la raison même de ma demande d'aide à travers cette publication s'il vous plaît ?

    Merci de votre aide.

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Comment donc procéder à l'automatisation car la raison même de ma demande d'aide à travers cette publication s'il vous plaît ?
    Il faut procéder par étape. Au début tu n'avais rien, maintenant que tu as quelque chose qui fonctionne tu peux l'enrichir.

    A ta place, je ferais le référencement :
    1. dans un tableau $headerNames de toutes les en-têtes CSV possibles des noms, ex. $headerNames = ['Name', 'Last Name', '...']
    2. dans un tableau $headerEmails de toutes les en-têtes CSV possibles des e-mails, ex. = $headerEmails = ['Email-Address', 'Address Email', '...']

    Puis lors du traitement du fichier source :
    1. On récupère la ligne d'en-tête CSV du fichier source (ligne 16 sur mon script, avec le $header)
    2. Pour chacun des éléments de $header, on cherche s'il s'agit
    2.1. d'une en-tête comprise dans $headerNames, ex. if (in_array($value, $headerNames)) => Si oui valoriser $nameIndex selon l'index de l'élément
    2.2. d'une en-tête comprise dans $headerEmails => Si oui valoriser $emailIndex selon l'index de l'élément
    3. Laisser le script donné plus haut suivre son cours : while ($entry = ...)

    Si tu bloques donne-nous tes tentatives pour qu'on puisse te guider.

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Merci pour votre réponse.

    J'ai eu une autre idée, juste, dites-moi comment pourrais-je récupérer la première ligne du fichier CSV c'est-à-dire la ligne contenant l'entête sans l'ignorer ?
    Je veux juste récupérer la première ligne du Fichier CSV. Comment donc la récupérer ???

    Merci d'avance

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Je récupère la ligne d'en-tête dans mon script ! As-tu essayé de le comprendre ? Lis-le bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $header = fgetcsv($fp_source, 0, ',', '"', ''); // 1re ligne, c'est l'en-tête, on l'ignore
    Je dis qu'on l'ignorait car on n'en faisait rien.

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Bonjour et merci pour votre réponse.

    J'ai finalement pu récupérer la 1ère ligne contenant l'en-tête grâce à la fonction read ci-dessous et en faisan appel à l'index 0 de la variable $csv représenant le Tableau généré par cette fonction read.
    Sauf que je reçois une erreur de variable $email non définie pourtant elle est bien définie.

    Voici le code modifié qui n'affiche pas les emails dans le fichier Fichier1.new3.csv et qui retourne une erreur Undefined variable: email:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php
     
    function read($csv){
        $file = fopen($csv, 'r');
        while (!feof($file) ) {
            $line[] = fgetcsv($file, 0);
        }
        fclose($file);
        return $line;
    }
    // Définir le chemin d'accès au fichier CSV
    $csv = 'Fichier2.csv';
    $csv = read($csv);
    print_r($csv[0]);
    echo "<br />";
    // $headerList = implode(",", $csv[0]);
    // echo $headerList;
     
    foreach($csv[0] as $headerMenu){
    	if(stripos($headerMenu, "email") !== false){
    		$csv[0] = str_replace($headerMenu, "Email", $csv[0]);
    	} else if(stripos($headerMenu, "name") !== false){
    		$csv[0] = str_replace($headerMenu, "Name", $csv[0]);
    	}
    }
    print_r($csv[0]);
     
     
    // Paramétrage des fichiers
    $file_source = 'Fichier2.csv';
    $file_destination = 'Fichier1.new3.csv';
     
    // Création du fichier de destination
    $fp_destination = fopen($file_destination, 'w');
    fputcsv($fp_destination, ['Name', 'Email'], ',', '"', ''); // Ecriture de l'en-tête
     
    $fp_source = fopen($file_source, 'r');
    $header = fgetcsv($fp_source, 0, ',', '"', ''); // 1ere ligne, c'est l'en-tête, on l'ignore
    foreach($csv[0] as $key => $value) {		// Je cherche ici à récupérer la clé de la valeur de la première ligne du Tableau du fichier CSV
    	while ($entry = fgetcsv($fp_source, 0, ',', '"', '')) {
    		// Je vérifie si la valeur du Tableau est égal à "Name". Si oui je récupère sa clé comme Index que je passe comme à la variable "$entry"
    		if($value == "Name"){
    		   $name = $entry[$key];
    		} 
    		/* Je fais pareil ici en vérifiant également si la valeur du Tableau est égal à "Email". Si oui je récupère sa clé comme Index que je passe comme à la 
    		 variable "$entry". Mais ça ne vérifie pas ce "else if" */
    		elseif($value == "Email"){
    		   $email = $entry[$key];
    		}
    		fputcsv($fp_destination, [$name, $email], ',', '"', '');
    	}
    }
     
    fclose($fp_source);
    fclose($fp_destination);
     
    ?>
    Je reçois un retour d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Notice: Undefined variable: email in C:\laragon\www\csv.php on line 50
     
    Notice: Undefined variable: email in C:\laragon\www\csv.php on line 50
     
    Notice: Undefined variable: email in C:\laragon\www\csv.php on line 50
    Et le fichier Fichier1.new3.csv généré contient seulement les noms sans les adresses emails exactement comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Name,Email
    Marry,
    Jame,
    Luan,
    Nghi,
    Aidez-moi à corriger mon code ci-dessous pour réussir à exraitre et afficher les emails exactement comme s'affiche déjà les noms.

    D'avance merci.

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    J'ai finalement pu récupérer la 1ère ligne contenant l'en-tête grâce à la fonction read ci-dessous et en faisan appel à l'index 0 de la variable $csv représenant le Tableau généré par cette fonction read.
    Ça ne sert à rien. Comme déjà dit 3 fois plus haut tu l'avais déjà dans mon script, variable $header.

    Aidez-moi à corriger mon code ci-dessous
    On dirait que tu as mélangé nos deux scripts sans essayer d'appliquer l'algo donné.
    Ce n'est pas une correction, mais une réécriture complète qui est nécessaire

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Bonsoir.

    Voici ce que j'ai fait. Ça a l'air de marcher mais je voudrais savoir si c'était ce que vous me conseillez ???

    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
    33
    <?php
     
    // Paramétrage des fichiers
    $file_source = 'Fichier2.csv';
    $file_destination = 'Fichier3.new.csv';
     
    // Création du fichier de destination
    $fp_destination = fopen($file_destination, 'w');
    fputcsv($fp_destination, ['Name', 'Email'], ',', '"', ''); // Ecriture de l'en-tête
     
    $fp_source = fopen($file_source, 'r');
    $header = fgetcsv($fp_source, 0, ',', '"', ''); // 1re ligne, c'est l'en-tête
    $headerNames = array('Name', 'Last Name', 'FIRST_NAME', 'LAST_NAME', 'First Name', 'FirstName', 'LastName', 'Country', 'Company', 'COMPANY_NAME', 'COMPANY NAME', 'Business Name', 'CompanyName', 'Company Name', 'Company_Name');
    $headerEmails = ['Email-Address', 'Address Email', 'Email Address', 'Email_Address', 'EMAIL', 'Email', 'EmailAddress', 'EMAIL_ADDRESS', 'ADDRESS-EMAIL'];
     
    // Paramétrage des colonnes à récpuérer selon le fichier CSV source
    foreach($header as $keyHeader => $valueHeader) {
    	if (in_array($valueHeader, $headerNames)) {
    		$nameIndex = $keyHeader;
    	} else if (in_array($valueHeader, $headerEmails)) {
    		$emailIndex = $keyHeader;
    	}
    }
     
    while ($entry = fgetcsv($fp_source, 0, ',', '"', '')) {
        $name = $entry[$nameIndex];
        $email = $entry[$emailIndex];
        fputcsv($fp_destination, [$name, $email], ',', '"', '');
    }
     
    fclose($fp_source);
    fclose($fp_destination);
    ?>
    Dans l'attente de vos remarques.

    D'avance merci.

  13. #13
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    C'est pas mal du tout, bravo

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Merci beaucoup pour votre soutien.

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

Discussions similaires

  1. Récupérer le nom des colonnes dans une Listbox Multicolonnes
    Par rampage92 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/04/2017, 18h48
  2. Réponses: 7
    Dernier message: 12/04/2007, 14h04
  3. [C#] Récupérer le nom des colonnes d'une datatable
    Par dai.kaioh dans le forum Accès aux données
    Réponses: 6
    Dernier message: 28/09/2006, 17h35
  4. [PostGreSQL] Récupérer les noms des colonnes
    Par Olivier14 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/02/2006, 18h51
  5. Comment récupérer le nom des colonnes ?
    Par constantin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/10/2005, 11h29

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