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 :

Mon Code ne traite pas la colonne Email dans les fichiers CSV


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2013
    Messages
    323
    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 : 323
    Points : 36
    Points
    36
    Par défaut Mon Code ne traite pas la colonne Email dans les fichiers CSV
    Bonjour.

    Mon code ci-après fonctionne bien et permet d'extraire le Nom et l'Email de ce fichier .csv à traiter. Le problème c'est que, pour traiter un fichier .csv qui contient les chaînes de caractères , Inc. et , Corp., mon Code ci-dessous considère les caractères , Inc. et , Corp. qui sont compris dans le noms comme des colonnes.

    Par exemple, le contenu du fichier Fichier2.csv est ce qui suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CompanyName,Email,Phone Number
    Test Web1, Inc.,test1@test.com,6898655
    Test Web2, Corp.,test2@test.com,78554466
    Mais après le traitement ou l'exécution du code PHP ci-dessous, je reçois comme résultats dans le nouveau fichier Fichier3.new.csv ce qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Name,Email
    Test Web1,"Inc."
    Test Web2,"Corp."

    Voici le 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
    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);
    ?>
    Aidez-moi s'il vous plaît à revoir mon Code afin que le retour ne prenne pas en considération la virgule (,) avant le , Inc. et le , Corp. comme la colonne de Email et ressemble à un truc comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Name,Email
    Test Web1, Inc.,test1@test.com
    Test Web2, Corp.,test2@test.com

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de Séb.
    Profil pro
    Inscrit en
    mars 2005
    Messages
    3 699
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 699
    Points : 5 085
    Points
    5 085
    Par défaut
    Ton fichier CSV est mal formé. Les valeurs contenant le séparateur , doivent être délimitées avec "

    Il faut revoir ta source de données.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2013
    Messages
    323
    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 : 323
    Points : 36
    Points
    36
    Par défaut
    Bonjour et merci pour votre réponse mais le fichier CSV comportent plusieurs milliers de lignes de contacts et donc impossible de corriger cela à la main. Donc, j'ai réfléchis à remplacer toutes les chaînes de caractères à virgule suivie d'un espace (,) qui précédent les mots Inc. et Corp. par un simple espace. Pour ça, j'ai essayé d'utiliser str_getcsv et str_replace à la ligne 5 pour modifier le contenu de la variable $file_source qui représente le Fichier CSV à traiter:

    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
    <?php
     
    // Paramétrage des fichiers
    $file_source = 'Fichier2.csv';
    $file_source = str_getcsv(str_replace(', ', ' ', file_get_contents($file_source)));               //  // J'essaie ici de remplacer tous les ", " par " " dans le fichier CSV à traiter défini ci-dessus:
    $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);
    ?>
    Mais ça me retourne une liste d'erreur ci-après:

    Warning: fopen() expects parameter 1 to be a valid path, array given in C:\laragon\www\csv.php on line 12
    Warning: fgetcsv() expects parameter 1 to be resource, bool given in C:\laragon\www\csv.php on line 13
    Warning: Invalid argument supplied for foreach() in C:\laragon\www\csv.php on line 18
    Warning: fgetcsv() expects parameter 1 to be resource, bool given in C:\laragon\www\csv.php on line 26
    Warning: fclose() expects parameter 1 to be resource, bool given in C:\laragon\www\csv.php on line 32

    Alors, s'il vous plaît, comment remplacer toutes les chaînes de caractères à virgule suivie d'un espace (,) qui précédent les mots Inc. et Corp. par un simple espace dans le fichier CSV $file_source = 'Fichier2.csv' dont je cherche à extraire les Noms et Emails ???

    Merci d'avance.

  4. #4
    Expert confirmé Avatar de Séb.
    Profil pro
    Inscrit en
    mars 2005
    Messages
    3 699
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 699
    Points : 5 085
    Points
    5 085
    Par défaut
    Non mais là il faut faire un script spécifique de correction du CSV et pas tout mélanger avec le script précédent, sinon tu ne t'en sortiras jamais.

    T'es sûr qu'i y a tant de ", Truc" que ça ? Même s'il n'y en a une 100aine tu auras plus vite fait de corriger à la main.

    Sinon ce qu'il faut faire :

    1. Lire le fichier ligne par ligne avec fgetcsv()
    2. Tester chaque valeur de l'entrée
    3. Si une valeur est " Corp." ou " Inc." tu la concatènes précédée d'une "," à la valeur précédente de l'entrée et tu supprimes la valeur de l'entrée
    4. Tu écris l'entrée dans un nouveau fichier avec fputcsv()
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2013
    Messages
    323
    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 : 323
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Sinon ce qu'il faut faire :

    3. Si une valeur est " Corp." ou " Inc." tu la concatènes précédée d'une "," à la valeur précédente de l'entrée et tu supprimes la valeur de l'entrée
    Merci pour votre réponse.

    Je ne sais vraiment pas comment m'y prendre. Voici donc ce que j'ai pu faire et je reconnais que c'est du Grand n'importe quoi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $file = 'Fichier2.csv';
    $file_open = fopen($file, 'r');
    $file_dest = 'FichierCorrect.csv';
    while ($fileRead = fgetcsv($fp_source, 0, ',', '"', '')) {
       if ($fileRead= fgetcsv($file_open, 0, ', Corp', '"', '') || $fileRead= fgetcsv($file_open, 0, ', Inc', '"', '')) {
           $fileCorrect = str_replace(", Corp", " - ", $fileRead);
           $fileCorrect = str_replace(", Corp", " - ", $fileCorrect);
           fputcsv($file_dest, $fileCorrect, ',', '"', '');
       }
    }
     
    fclose($file_open);
    fclose($file_dest);
    J'ai fait vraiment du Grand n'importe quoi.
    Aidez-moi s'il vous plaît à travers un exemple de code. Je suis vraiment bloqué.

Discussions similaires

  1. Réponses: 13
    Dernier message: 05/06/2021, 23h09
  2. comment éliminer des colonnes vides dans un fichier csv
    Par xavier81 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 10/05/2012, 23h30
  3. [MySQL] Exporter le contenu d'un champ email dans un fichier csv
    Par thamis dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 12/01/2010, 16h17
  4. Mon code ne fonctionne pas (envoi de données vers un fichier csv)
    Par beegees dans le forum Bibliothèques et frameworks
    Réponses: 16
    Dernier message: 21/01/2009, 16h04
  5. Réponses: 3
    Dernier message: 08/09/2008, 23h55

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