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 :

Gestion des guillemets dans Export csv [PHP 7]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable Exploitation Electricité
    Inscrit en
    Février 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Responsable Exploitation Electricité

    Informations forums :
    Inscription : Février 2023
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Gestion des guillemets dans Export csv
    Bonjour,

    J'ai un petit soucis avec un export *.csv de ma boutique vers pinterest.

    J'arrive bien a créer mon fichier mais au niveau des mes descriptions de produit j'ai du html dedant que j'ai volontairement conservé pour embellir le texte sur pinterest.

    Certaine de mes descriptions ne sont pas complètes dans mon csv.

    Voilà un exemple de description:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p><strong>Descriptif</strong> : S’utilise avec les produits techniques <span style="color:#2c9ffd;"><a href="mon_site" target="_blank" style="color:#2c9ffd;" rel="noreferrer noopener">BBHaire</a></span>.</p>

    Dans mon fichier csv j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p><strong>Descriptif</strong> : S’utilise avec les produits techniques <span style=""color:#2c9ffd
    Sans surprise les guillemets posent problème puisqu'ils sont utilisés comme délimiteur. Du coup Il manque un bout. J'ai essayé de mettre un addslashes sans grande conviction et j'obtiens ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p><strong>Descriptif</strong> : S’utilise avec les produits techniques <span style=\"color:#2c9ffd
    J'ai lu que dans un fichier csv il fallait échapper les guillemets par un double guillemets. Je pensais pouvoir faire ca facilement avec un preg_replace mais j'obtiens un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $description = preg_replace('"', '""', $description);
    Warning: preg_replace(): No ending delimiter '"' found in............

    Si quelqu'un a une idée pour me sortir de cette galère je suis preneur.

    Merci d'avance

  2. #2
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut
    Bonsoir,

    Pouvez-vous mettre le code qui va générer ce que vous souhaitez obtenir, là il est difficile de vous aider
    Cela semble provenir d'une base de données.

    Il est possible que ceci puisse déjà vous aider : https://www.php.net/manual/fr/function.htmlentities.php

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 269
    Points : 8 568
    Points
    8 568
    Billets dans le blog
    17
    Par défaut
    Normalement avec CSV on échappe un " en le doublant.

    Pour créer un CSV il faut utiliser fputcsv() qui gère tout cela très bien.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Responsable Exploitation Electricité
    Inscrit en
    Février 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Responsable Exploitation Electricité

    Informations forums :
    Inscription : Février 2023
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci ddaweb pour la réponse

    Les données proviennent de Prestashop. Je fais un export de mes produit via le back office. Je récupère donc déjà un fichier csv issu d'une base de donnée mysql. Dans ce fichier csv les guillemet sont bien doublés pour les échapper.

    Ensuite j'ai écrit un peut de php pour remettre en forme tout ca au format demandé par Pinterest en faisant une ou deux requêtes supplémentaire pour aller chercher des éléments comme les prix soldés directement dans la BDD.

    J'upload le fichier issu de Prestashop et je génère un nouveau fichier csv au format de Pinterest

    Ce qui sort de prestashop à bien les guillemet doublé pour échapper les guillemet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    63;"<p><strong>Descriptif</strong> : S’utilise avec les produits techniques <span style=""color:#2c9ffd;""><a href=""mon_site"" target=""_blank"" style=""color:#2c9ffd;"" rel=""noreferrer noopener"">BBHair Shine</a></span>. Il participe au bon développement du produit pour un résultat optimal.<br /><br /><strong>Mode d'emploi</strong> : Dilution 1+1,5 avec la coloration BBhair Shine.</p>
    Concernant le code que j'utilise:

    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
    // préparation tableau pour fichier CSV
    $tabproduits = [];
    $tabproduits[] = ['id', 'title', 'description', 'link', 'image_link', 'price', 'availability', 'description_html', 'sale_price', 'brand'];
     
     
    // fichier uploadé issu de prestashop
    $fileName = $_FILES["file"]["tmp_name"];
     
    if ($_FILES["file"]["size"] > 0) {
     
       // on ouvre le ficher
       $file = fopen($fileName, "r");
     
       // boucle d'exploration des colonne
       while (($column = fgetcsv($file, 10000, ";")) !== FALSE) {
     
       // échappement guillemets sur description html
       $descript = str_replace('"', '""',  $column['5']);
     
       // on insère les enregistrement dans notre tableau CSV
       $tabproduits[] = ["$column[0]", "$column[6]", "$column[3]", "$column[2]", "$column[1]", "$column[4]", $stock, $descript,$prix_final, $marque];
       $fichier_csv = fopen("exp_pinteres.csv", "w+");
       fprintf($fichier_csv, chr(0xEF).chr(0xBB).chr(0xBF));
     
       // ajout des lignes au csv 
       foreach($tabproduits as $ligne){
          fputcsv($fichier_csv, $ligne, ",");
          }
       fclose($fichier_csv);
     
       }
    }
    Voilà en gros à quoi ça ressemble. J'ai enlevé toute la partie ou je vais chercher des choses directement dans la base de données car c'est sur la description avec HTML que ça bloque.
    Dans l'exemple du dessus j'ai essayé avec un str_replace à la place du preg_replace et maintenant les guillemets sont triplés. Ma description est toujours coupé.

    Je vais aller voir votre lien

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    pouvez-vous mettre en pièce jointe un fichier de test que vous utilisez ?
    peut-être que votre fichier est bien au format csv mais que c'est le souci est à l'importation.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Responsable Exploitation Electricité
    Inscrit en
    Février 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Responsable Exploitation Electricité

    Informations forums :
    Inscription : Février 2023
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Voici le fichier csv exporté de prestashop:

    Export prestashop

    Les guillemets sont bien doublés pour les échapper dans la description des produits ID 60 et 63

    Voici le fichier csv que j'obtiens après avoir formaté le fichier avec mon code et la description str_replace:

    resultat pour pinterest

    Les guillemets sont triplés et il manque toujours un morceau de ma description toujours sur l'ID 60 et 63.

    Pour les autres produits pas de problème puisqu'il n'y a pas de guillemets dans les descriptions.

  7. #7
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut
    Citation Envoyé par Tof90 Voir le message
    Ce qui sort de prestashop à bien les guillemet doublé pour échapper les guillemet
    Alors il me semble que le soucis est ici : https://www.php.net/manual/fr/function.str-replace.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $descript = str_replace('"', '""',  $column['5']);  // ----- Votre code
    $descript = str_replace('""', '"',  $column['5']); // ----- Remplacer les doubles guillemets par un simple
    EDIT : j'ai posté juste avant d'avoir lu votre réponse ci-dessus, il va falloir creuser

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Responsable Exploitation Electricité
    Inscrit en
    Février 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Responsable Exploitation Electricité

    Informations forums :
    Inscription : Février 2023
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Ca semble fonctionner. Quand j'ouvre le fichier csv avec NotePad j'ai bien le résultat attendu. Si je l'ouvre avec excel il manque toujours un morceau à ma description mais ce n'est pas vraiment étonnant de la part d'Excel.

    Je vais essayer d'envoyer tout ca chez Pinterest.


    Merci ddaweb pour votre aide

  9. #9
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    votre fichier a l'air correct et il est bien lu par la fonction "fgetcsv" et il est aussi bien lu par LibreOffice.
    donc c'est surement pinterest qui ne gère pas correctement ce format et il faudrait leur demander quel est le format à utiliser.

    à tout hasard, essayez peut-être de remplacer les "" par \".

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 269
    Points : 8 568
    Points
    8 568
    Billets dans le blog
    17
    Par défaut
    Voici le fichier csv que j'obtiens après avoir formaté le fichier avec mon code et la description str_replace:
    resultat pour pinterest
    Ce fichier est invalide. Tu as du CSV dans du CSV.
    Ton code est dur à lire (mauvaise indentation), mais je fais quand même l'effort...

    Est-il produit avec le code ci-dessous ? Tu utilises fputcsv() pour chaque colonne d'une même ligne, or il faut utiliser fputcsv() 1 seule fois par ligne avec en paramètre le tableau de données de la ligne.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $tabproduits[] = ["$column[0]", "$column[6]", "$column[3]", "$column[2]", "$column[1]", "$column[4]", $stock, $descript,$prix_final, $marque];
    $fichier_csv = fopen("exp_pinteres.csv", "w+");
    fprintf($fichier_csv, chr(0xEF).chr(0xBB).chr(0xBF));
     
    // ajout des lignes au csv 
    foreach($tabproduits as $ligne){
      fputcsv($fichier_csv, $ligne, ",");
    }

    Par ailleurs, la syntaxe "$column[0]" est mauvaise car alourdit inutilement le script et la lecture => Les " doivent être retirées !

  11. #11
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut
    Citation Envoyé par Tof90 Voir le message
    ... Si je l'ouvre avec excel il manque toujours un morceau à ma description mais ce n'est pas vraiment étonnant de la part d'Excel.
    Ouvrir Excel avec un CSV qui a un séparateur ',' doit se faire autrement :

    1. Ouvrir Excel -> feuille vierge
    2. Menu "Données"
    3. A partir d'un fichier texte/CSV (en haut à gauche) - ou - Obtenir des données -> A partir d'un fichier -> A partir d'un fichier texte/CSV
    4. Choisir le fichier
    5. Choisir le délimiteur comme ',' ... comment le faire dépend de la version d'Excel

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Responsable Exploitation Electricité
    Inscrit en
    Février 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Responsable Exploitation Electricité

    Informations forums :
    Inscription : Février 2023
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Par ailleurs, la syntaxe "$column[0]" est mauvaise car alourdit inutilement le script et la lecture => Les " doivent être retirées !
    Effectivement j'ai repris rapidement le code pour vous donner une exemple car il y a plus de 150 lignes. J'ai supprimé toute la partie traitement / formatage entre la récupération de l'export Prestashop et la création du csv. J'ai un peu fait le bourrin .

    La ligne en question est sous cette forme dans mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tabproduits[] = [$id, $titre, addslashes($desc), $lienFortmate, $lienimage, $prix_format, $stock, $descript, $prix_final, $marque];
    Ouvrir Excel avec un CSV qui a un séparateur ',' doit se faire autrement :

    1. Ouvrir Excel -> feuille vierge
    2. Menu "Données"
    3. A partir d'un fichier texte/CSV (en haut à gauche) - ou - Obtenir des données -> A partir d'un fichier -> A partir d'un fichier texte/CSV
    4. Choisir le fichier
    5. Choisir le délimiteur comme ',' ... comment le faire dépend de la version d'Excel
    J'ai essayé en ouvrant le csv et en passant par Données / Convertir mais seul la première ligne était mise en forme. Je ne connaissais pas cette façon d'ouvrir un csv sous Excel. Ca marche beaucoup mieux.

    Merci à tous pour votre aide Reste plus qu'a envoyé tout ca dans Pinterest.

  13. #13
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut
    Citation Envoyé par Tof90 Voir le message
    J'ai essayé en ouvrant le csv et en passant par Données / Convertir mais seul la première ligne était mise en forme. Je ne connaissais pas cette façon d'ouvrir un csv sous Excel. Ca marche beaucoup mieux.
    Pour ouvrir un CSV directement dans Excel, le séparateur doit être un ';' !
    Cette méthode permet d'ouvrir d'autres types de fichiers, pas que CSV, comme du TXT ... du moment qu'il y a un séparateur pour faire la mise en page : ce séparateur pourrait être une tabulation, '|', etc...
    Il y a aussi d'autres critères pour la mise page ... là il faut un peu expérimenter afin d'obtenir le résultat souhaité.
    Pour ton fichier, j'ai eu une bonne mise en page pour la plupart des lignes, mais il y a des ',' dans tes descriptions qui on perturbé la mise page pour quelques lignes -> Excel les considère comme séparateur

    EDIT :
    Je n'ai pas le fichier final, mais je suis un peu surpris que tes éléments texte ne soient pas entourés d'un " ou ' pour éviter les soucis de ,
    J'ai du faire un CSV pour une importation dans Winbook (le programme de comptabilité de notre comptable) avec un séparateur "," et c'est comme cela que j'ai du faire.

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

Discussions similaires

  1. [2005] Traitement des guillemets dans un CSV
    Par sdionne dans le forum SSIS
    Réponses: 5
    Dernier message: 17/01/2019, 09h33
  2. [E-03] Gestion des guillemets dans une chaîne de caractères
    Par clemou dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/03/2009, 15h25
  3. [Sécurité]Gestion des accès dans plusieurs bases
    Par vincentj dans le forum Débuter
    Réponses: 1
    Dernier message: 05/01/2005, 15h19
  4. Gestion des headers dans un Makefile
    Par Weren dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/11/2004, 11h44
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 12h20

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