Comment dois-je échapper les virgules et les marques de discours dans les fichiers CSV pour qu'ils fonctionnent dans Excel?

111

Je génère un fichier CSV (délimité par des virgules plutôt que par des tabulations). Mes utilisateurs ouvriront probablement le fichier CSV dans Excel en double-cliquant dessus. Mes données peuvent contenir des virgules et des marques de discours, je les échappe donc comme suit.

Reference, Title, Description
1, "My little title", "My description, which may contain ""speech marks"" and commas."
2, "My other little title", "My other description, which may also contain ""speech marks"" and commas."

Autant que je sache, cela a toujours été la manière de procéder. Voici mon boggle: lorsque j'ouvre ce fichier dans Excel 2010, mon échappement n'est pas respecté. Les marques de discours apparaissent sur la feuille et la virgule crée de nouvelles colonnes.

centralscru
la source

Réponses:

219

Nous avons finalement trouvé la réponse à cela.

Excel ne respectera l'échappement des virgules et des marques de discours que si la valeur de la colonne n'est PAS précédée d'un espace. Donc, générer le fichier sans espaces comme celui-ci ...

Reference,Title,Description
1,"My little title","My description, which may contain ""speech marks"" and commas."
2,"My other little title","My other description, which may also contain ""speech marks"" and commas."

... a résolu le problème. J'espère que cela aide quelqu'un!

centralscru
la source
2
C'est un problème que j'ai rencontré auparavant et je l'oublie toujours. Excel doit interrompre ce comportement, car il crée simplement de la confusion et n'est pas une règle utile à avoir en premier lieu. Cela ou les csv ne devraient pas avoir d'espace blanc obligatoire entre les virgules.
Jacques Mathieu
61

Voici les règles si vous pensez que c'est aléatoire. Une fonction d'utilité peut être créée sur la base de ces règles.

  1. Si la valeur contient une virgule, une nouvelle ligne ou des guillemets doubles, la valeur String doit être renvoyée entre guillemets.

  2. Tout caractère de guillemet double dans la valeur doit être échappé par un autre guillemet double.

  3. Si la valeur ne contient pas de virgule, de retour à la ligne ou de guillemet double, la valeur String doit être renvoyée sans modification.

AlphaBetaGamma
la source
4
Est-ce que ça fait mal de mettre entre guillemets quelque chose qui n'a pas de virgules, de doubles guillemets ou de nouvelles lignes?
Erik Reppen
2
Non ErikReppen Je ne pense pas que ça ferait mal normalement. J'appartiens à un arrière-plan java où il est recommandé de ne pas créer de nouvelles chaînes en remplaçant le texte dans l'ancien car ils ont leur propre part dans la mémoire du tas. Si vous le souhaitez, vous pouvez remplacer toutes les valeurs de manière inconditionnelle et nous dire si cela pose un problème alors que cela ne devrait pas.
AlphaBetaGamma
2
Un champ qui commence ou se termine par un espace doit être entre guillemets.
Jonathan Rosenne
2

Selon les instructions de Yashu, j'ai écrit la fonction suivante (c'est du code PL / SQL, mais il devrait être facilement adaptable à n'importe quel autre langage).

FUNCTION field(str IN VARCHAR2) RETURN VARCHAR2 IS
    C_NEWLINE CONSTANT CHAR(1) := '
'; -- newline is intentional

    v_aux VARCHAR2(32000);
    v_has_double_quotes BOOLEAN;
    v_has_comma BOOLEAN;
    v_has_newline BOOLEAN;
BEGIN
    v_has_double_quotes := instr(str, '"') > 0;
    v_has_comma := instr(str,',') > 0;
    v_has_newline := instr(str, C_NEWLINE) > 0;

    IF v_has_double_quotes OR v_has_comma OR v_has_newline THEN
        IF v_has_double_quotes THEN
            v_aux := replace(str,'"','""');
        ELSE
            v_aux := str;
        END IF;
        return '"'||v_aux||'"';
    ELSE
        return str;
    END IF;
END;
aaguilera
la source
0

Les guillemets simples fonctionnent également bien, même sans échapper les guillemets doubles, au moins dans Excel 2016:

'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'

Excel mettra cela en 5 colonnes (si vous choisissez le guillemet simple comme "Qualificateur de texte" dans l'assistant "Texte vers colonnes")

Golimar
la source
-3

Même après des guillemets doubles, j'ai eu ce problème pendant quelques jours.

Remplacement du séparateur de tuyau par une virgule, puis les choses ont bien fonctionné.

Ramkumar Navaneethakrishnan
la source
1
Vous devez donner un échantillon de ce qui a fonctionné pour vous afin que l'OP puisse le copier et le coller si nécessaire.
Reuben Tanner