Échapper correctement à un guillemet double dans CSV


164

J'ai une ligne comme celle-ci dans mon CSV:

"Samsung U600 24"","10000003409","1","10000003427"

La citation à côté de 24est utilisée pour exprimer les pouces, tandis que la citation juste à côté de cette citation ferme le champ. Je lis la ligne avec fgetcsvmais l'analyseur fait une erreur et lit la valeur comme suit:

Samsung U600 24",10000003409"

J'ai essayé de mettre une barre oblique inverse avant la citation en pouces, mais j'obtiens juste une barre oblique inverse dans le nom:

Samsung U600 24\"

Existe-t-il un moyen d'échapper correctement à cela dans le CSV, de sorte que la valeur soit Samsung U600 24", ou dois-je l'exprimer dans le processeur?


21
Doublez simplement votre devis. C'est tout
Votre bon sens

Réponses:


282

Utilisez 2 guillemets:

"Samsung U600 24"""

102
RFC-4180, paragraphe "Si des guillemets sont utilisés pour encadrer des champs, alors un guillemet double apparaissant à l'intérieur d'un champ doit être échappé en le précédant d'un autre guillemet double."
tommed le

4
Comme le dit tommed, il vous suffit d'ajouter un guillemet simple pour échapper à un guillemet double. Vous pouvez utiliser un outil de ligne de commande appelé csvfix pour détecter les lignes qui ne sont pas conformes: csvfix check -nl -v [nom de fichier]
Sam Critchley

2
@SamCritchley Je ne vois qu'un simple guillemet double utilisé pour s'échapper ici. Par "Utiliser 2 guillemets", user4035 signifie que 1 devis doit être remplacé par 2 guillemets. En échappant les guillemets doubles avec des guillemets doubles, vous créez effectivement des paires de guillemets doubles (2 guillemets doubles). La dernière citation que vous voyez à la fin est de terminer le champ.
Zenexer

1
simples doubles doubles simples doubles guillemets sont nécessaires, mais seulement si procédé par un double guillemet simple ... bonne chance!
Daniel Waltrip

14

Non seulement les guillemets doubles, vous aurez besoin d'un guillemet simple ( '), d'un guillemet double ( "), d'une barre oblique inverse ( \) et de NUL (l'octet NULL).

Utilisez fputcsv()pour écrire et fgetcsv()pour lire, qui s'occupera de tout.


3
Ce commentaire sur la page de documentation defputcsv() montre comment vous pouvez l'utiliser fputcsv()lorsque vous souhaitez générer une sortie au format csv vers le navigateur au lieu d'un fichier réel.
dennisschagt

15
@Angelin Nadar, pourriez-vous s'il vous plaît ajouter une source à votre réclamation concernant la nécessité de doubler les guillemets simples, les barres obliques inverses et NUL? Je ne l'ai pas trouvé dans la RFC-4180 .
Petr 'PePa' Pavel

2
Vous n'avez pas besoin d'échapper les guillemets simples, etc. Un fichier CSV approprié n'a même pas besoin d'ajouter des guillemets doubles autour d'un champ qui ne contient que des guillemets simples. Si le lecteur CSV est correctement implémenté, il doit lire correctement le fichier même avec ces symboles.
xji

4
Pourquoi cette réponse a-t-elle été votée? Le commentaire sur les caractères d'échappement n'a jamais été sauvegardé et la question d'origine ne pose pas de question sur PHP. Cela ne semble être vrai que pour le délimiteur de chaîne (et uniquement pour le délimiteur choisi) lorsqu'un programme, tel qu'Open Office, vous permet de le modifier.
Dave F

0

Je sais que c'est un ancien article, mais voici comment je l'ai résolu (avec la conversion de valeurs nulles en chaîne vide) en C # en utilisant une méthode d'extension.

Créez une classe statique avec quelque chose comme ce qui suit:

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

Ensuite, pour chaque chaîne que vous écrivez en CSV, au lieu de:

stringBuilder.Append( WhateverVariable );

Vous faites juste:

stringBuilder.Append( WhateverVariable.Q() );

-1

Si une valeur contient une virgule, un caractère de nouvelle ligne ou un guillemet double, la chaîne doit être placée entre guillemets. Par exemple: "Caractère de nouvelle ligne dans ce champ \ n".

Vous pouvez utiliser l'outil en ligne ci-dessous pour échapper aux opérateurs "" et,. https://www.freeformatter.com/csv-escape.html#ad-output

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.