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.
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!
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.
Si la valeur contient une virgule, une nouvelle ligne ou une citation double, la valeur String doit être renvoyée entre guillemets.
Tous les caractères de la citation double dans la valeur doivent être échappés avec une autre citation double.
Si la valeur ne contient pas de virgule, de nouvelle ligne ou de guillemet double, la valeur String doit être renvoyée telle quelle.
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;
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")