Existe-t-il un moyen d'inclure des virgules dans les colonnes CSV sans casser le formatage?

283

J'ai un CSV à deux colonnes avec un nom et un numéro. Le nom de certaines personnes utilise des virgules, par exemple. Joe Blow, CFA.Cette virgule casse le format CSV, car elle est interprétée comme une nouvelle colonne.

J'ai lu et la prescription la plus courante semble remplacer ce caractère, ou remplacer le délimiteur, par une nouvelle valeur (par exemple this|that|the, other).

J'aimerais vraiment garder le séparateur de virgules (je sais qu'Excel prend en charge d'autres délimiteurs, mais pas d'autres interprètes). Je voudrais également garder la virgule dans le nom, car cela Joe Blow| CFAsemble assez idiot.

Existe-t-il un moyen d'inclure des virgules dans les colonnes CSV sans casser la mise en forme, par exemple en les échappant?

buley
la source
1
Copie
Petit hack qui a fonctionné pour moi: ouvrez le fichier csv dans un éditeur de texte, puis collez-le dans un document Excel. Fonctionne si vous pouvez le faire en gros morceaux.
Jonas
@Jonas: Excel ne peut pas deviner si le même jeton est utilisé comme délimiteur ou comme partie des données. Le collage à partir d'un éditeur de texte ne change rien à cela.
IInspectable

Réponses:

373

Mettez le champ entre guillemets, par exemple

field1_value,field2_value,"field 3,value",field4, etc...

Voir wikipedia .

Mise à jour :

Pour coder un devis, utilisez ", un symbole de double guillemet dans un champ sera codé comme "", et le champ entier deviendra """". Donc, si vous voyez ce qui suit dans par exemple Excel:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

le fichier CSV contiendra:

regular_value,",,,""",","""",","""""""",""""

Une virgule est simplement encapsulée à l'aide de guillemets, ,devient ainsi ",".

Une virgule et une citation doivent être encapsulées et citées, ","devient ainsi """,""".

Ryan
la source
4
Cela a fonctionné pour moi! J'exportais une variable js vers CSV, et mettre une paire de guillemets supplémentaires autour de chaque chaîne, a aidé à résoudre le problème de "John Blow, CFA", comme mentionné dans la question.
Madhulika Mukherjee
Et s'il y a des guillemets et des virgules à l'intérieur de chaque cellule?
speedplane
2
J'ai mis à jour la réponse avec quelques exemples - en bref, les virgules sont encapsulées entre guillemets (comme ",") et les guillemets sont échappés (par exemple """)
Ryan
6
Maintenant, cela devrait être la réponse acceptée car elle propose une excellente solution qui résout probablement 99% des cas d'utilisation.
BuZz
Existe-t-il une bibliothèque C # pour analyser les fichiers csv avec des champs échappés par des guillemets?
Minh Tran
34

Le problème avec le format CSV, c'est qu'il n'y a pas une spécification, il existe plusieurs méthodes acceptées, sans aucun moyen de distinguer celles qui doivent être utilisées (pour générer / interpréter). J'ai discuté de toutes les méthodes pour échapper aux caractères (nouvelles lignes dans ce cas, mais même principe de base) dans un autre post . Fondamentalement, cela revient à utiliser un processus de génération / d'échappement CSV pour les utilisateurs prévus, et en espérant que le reste ne dérange pas.

Document de spécification de référence .

Rudu
la source
10
RFC 4180, Format commun et type MIME pour les fichiers de valeurs séparées par des virgules (CSV), ietf.org/rfc/rfc4180.txt ; une autre spécification «officielle».
Shi
3
L'inclusion de l'approche la plus largement acceptée en ferait une excellente réponse. En l'état, la réponse de @Ryan l'emporte.
rinogo
16

Si vous voulez faire ce que vous avez dit, vous pouvez utiliser des guillemets. Quelque chose comme ça

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

maintenant, vous pouvez utiliser une virgule dans votre variable de nom.

Nuage
la source
Merci Cloud pour ton conseil, ça y est: $whatever = "\"".$name."\"";
washere
Merci pour votre solution.
Bhavin Thummar
10

Vous devez citer ces valeurs.
Voici une spécification plus détaillée.

SLaks
la source
2
Il existe plusieurs spécifications, Excel utilise des guillemets autour de l'entrée, Linux utilise le caractère barre oblique inverse. Malheureusement, vous devez vous échapper pour votre public cible / système cible.
Rudu
7

En plus des points dans d'autres réponses: une chose à noter si vous utilisez des guillemets dans Excel est le placement de vos espaces. Si vous avez une ligne de code comme celle-ci:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

Excel traitera la citation initiale comme une citation littérale au lieu de l'utiliser pour échapper des virgules. Votre code devra être remplacé par

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

C'est cette subtilité qui m'a amené ici.

hlongmore
la source
3

J'ai fait face au même problème et citer le ,n'a pas aidé. Finalement, j'ai remplacé le ,avec +, terminé le traitement, enregistré la sortie dans un fichier externe et remplacé le +avec ,. Cela peut sembler laid mais cela a fonctionné pour moi.

Mohammed
la source
2
Et qu'auriez-vous fait si les données contenaient des caractères "+"?
Andrew Morton
1
@AndrewMorton Oui, c'est un défi. Mais dans mon cas, je suis sûr que cela +n'existe pas du tout dans mes données. Merci pour votre aimable commentaire.
Mohammed
4
Le moyen simple et robuste consiste à placer les chaînes entre guillemets doubles et à échapper les guillemets doubles dans les chaînes en utilisant deux d'entre elles comme "". C'est la façon normale de procéder.
Andrew Morton
1
Si cela ne fonctionne pas, vérifiez que vous ne générez pas d'espaces à côté de vos virgules de délimitation: "Frog", "yellow, green" fonctionnera "Frog", "yellow, green" ne fonctionnera pas
Dazbert
Personnellement, j'ai trouvé que le deuxième commentaire de @AndrewMorton ici m'a réellement aidé à comprendre ce qui vaut mieux qu'une réponse acceptée. Étape 1 - échapper aux guillemets doubles dans les champs de données, par exemple en Python: field = field.replace('"', '""')Étape 2 - après l'étape 1, entourez le champ lui-même entre guillemets doubles par exemple field = '"' + field + '"'- alors vous êtes moulé je pense.
Will Croxford
3

Selon votre langue, une méthode to_json peut être disponible. Cela échappera à beaucoup de choses qui brisent les CSV.

amiksch
la source
3

J'ai trouvé que certaines applications comme Numbers dans Mac ignorent la double citation s'il y a de l'espace devant elle.

a, "b,c"ne fonctionne pas pendant le a,"b,c"travail.

mudin
la source
1
Vous m'avez probablement sauvé une heure de travail ... merci!
Shaun314
1

Vous pouvez encoder vos valeurs, par exemple en PHP base64_encode ($ str) / base64_decode ($ str)

OMI, c'est plus simple que de doubler les devis, etc.

https://www.php.net/manual/en/function.base64-encode.php

Les valeurs codées ne contiendront jamais de virgule, donc chaque virgule dans votre CSV sera un séparateur.

Kevin
la source
1

Vous pouvez utiliser des littéraux de modèle (chaînes de modèle)

par exemple -

`"${item}"`
सत्यमेव जयते
la source
1
A fonctionné comme un charme!
waliurjs
0

Vous pouvez utiliser le Text_Qualifierchamp de votre gestionnaire de connexions de fichiers plats pour as ". Cela devrait encapsuler vos données entre guillemets et les séparer uniquement par des virgules en dehors des guillemets.

sakshi jain
la source
0

Premièrement, si la valeur de l'élément a un caractère de guillemet double ("), remplacez-le par 2 caractères de guillemet double (" ")

item = item.ToString().Replace("""", """""")

Enfin, encapsulez la valeur de l'article:

À GAUCHE: avec double guillemet (")

À DROITE: avec des guillemets (") et des virgules (,)

csv += """" & item.ToString() & ""","
LifeiSHot
la source
0

Les guillemets doubles n'ont pas fonctionné pour moi, cela a fonctionné pour moi \". Si vous souhaitez placer des guillemets doubles comme exemple, vous pouvez définir \"\".

Vous pouvez créer des formules, par exemple:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

écrira en csv:

= SI (C3 = 1, "", B3)

ingénieur mathématicien
la source
0

Ce n'est peut-être pas ce dont nous avons besoin ici, mais c'est une très vieille question et la réponse peut aider les autres. Un conseil que je trouve utile lors de l'importation dans Excel avec un séparateur différent consiste à ouvrir le fichier dans un éditeur de texte et à ajouter une première ligne comme:

sep = |

où | est le séparateur que vous souhaitez qu'Excel utilise. Alternativement, vous pouvez changer le séparateur par défaut dans Windows mais un peu long:

Panneau de configuration> Horloge et région> Région> Formats> Supplémentaire> Numéros> Séparateur de liste [passer de la virgule à votre alternative préférée]. Cela signifie qu'Excel exportera également par défaut les fichiers CSV à l'aide du séparateur choisi.

user25307
la source