web-dev-qa-db-fra.com

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

Je génère un fichier CSV (délimité par des virgules plutôt que des tabulations). Mes utilisateurs vont probablement ouvrir le fichier CSV dans Excel en double-cliquant dessus. Mes données peuvent contenir des virgules et des marques de langage, je les échappe 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é le moyen de le faire. Voici mon boggle: lorsque j'ouvre ce fichier dans Excel 2010, mon échappement n'est pas respecté. Des marques de parole apparaissent sur la feuille et la virgule crée de nouvelles colonnes.

96
centralscru

Nous avons finalement trouvé la réponse à cette question.

Excel respectera uniquement l'échappement des virgules et des marques de parole 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."

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

195
centralscru

Vous trouverez ci-dessous les règles si vous croyez 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 une citation double, la valeur String doit être renvoyée entre guillemets.

  2. Tous les caractères de la citation double dans la valeur doivent être échappés avec une autre citation double.

  3. Si la valeur ne contient pas de virgule, de nouvelle ligne ou de guillemet double, la valeur String doit être renvoyée telle quelle.

53
Yashu

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;
2
aaguilera

Les guillemets simples fonctionnent également très bien, même sans échapper aux guillemets doubles, du 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 dans 5 colonnes (si vous choisissez la citation simple comme "Qualificatif de texte" dans l'assistant "Texte en colonnes")

0
golimar