web-dev-qa-db-fra.com

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

J'ai un fichier 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 rompt le format CSV, car il est interprété comme une nouvelle colonne.

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

J'aimerais vraiment conserver le séparateur de virgule (je sais qu'Excel prend en charge d'autres délimiteurs, mais d'autres interprètes ne le peuvent pas). J'aimerais aussi garder la virgule dans le nom, car Joe Blow| CFA est plutôt idiot.

Existe-t-il un moyen d'inclure des virgules dans les colonnes CSV sans interrompre le formatage, par exemple en les échappant?

153
buley

Le problème avec le format CSV, c’est qu’il n’existe pas une seule spécification, il existe plusieurs méthodes acceptées, sans possibilité de distinguer celles qui doivent être utilisées (pour générer/interpréter). J'ai discuté de toutes les méthodes pour échapper des caractères (nouvelles lignes dans ce cas, mais les mêmes prémisses de base) dans un autre post . En gros, il s’agit d’utiliser un processus de génération/évasion CSV pour les utilisateurs visés et d’espérer que le reste ne dérange pas.

Document de référence .

31
Rudu

Placez le champ entre guillemets, par exemple.

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

Voir wikipedia .

Mis à jour:

Pour coder une citation, utilisez ", un seul symbole de citation dans un champ sera codé en tant que "" et le champ entier deviendra """". Donc, si vous voyez ce qui suit, par exemple, Exceller:

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

le fichier CSV contiendra:

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

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

Une virgule et une citation doivent être encapsulées et citées afin que "," devienne ""","""

181
Ryan

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

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

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

10
Cloud

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

8
SLaks

Outre les points des autres réponses: si vous utilisez des guillemets dans Excel, vous devez noter le placement de vos espaces. Si vous avez une ligne de code comme ceci:

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 aux virgules. Votre code devra changer pour

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

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

6
hlongmore

J'ai rencontré le même problème et citer le , n'a pas aidé. Finalement, j'ai remplacé le , par le +, terminé le traitement, sauvegardé la sortie dans un fichier de sortie et remplacé le + par le ,. Cela peut paraître moche mais cela a fonctionné pour moi. 

2
Mohammed

Vous pouvez coder vos valeurs, par exemple dans PHP base64_encode ($ str)/base64_decode ($ str)

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

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

Les valeurs codées ne contiendront jamais de virgule. Chaque virgule de votre CSV constituera un séparateur.

1
Kevin

Tout d'abord, si la valeur de l'élément comporte un caractère de guillemet double ("), remplacez-le par 2 caractères de guillemet double (" ")

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

Enfin, envelopper la valeur de l'article

À GAUCHE: avec caractère de citation double (")

À DROITE: avec caractère de citation double (") et virgule (,)

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

Vous pouvez utiliser le champ Text_Qualifier dans votre gestionnaire de connexions de fichiers plats pour lui attribuer la valeur ". Cela devrait envelopper vos données entre guillemets et ne les séparer que par des virgules qui sont en dehors des guillemets.

0
sakshi jain

Les guillemets doubles ne fonctionnaient pas pour moi, cela fonctionnait pour moi \". Si vous souhaitez placer des guillemets doubles à titre d'exemple, vous pouvez définir \"\".

Vous pouvez construire des formules, à titre d'exemple:

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

écrira en csv:

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

0
mathengineer

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

0
amiksch

Ce n’est peut-être pas ce dont on a besoin ici, mais c’est une question très ancienne et la réponse peut aider les autres. Une astuce 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 celle-ci:

sep = |

où | est le séparateur que vous souhaitez utiliser avec Excel. 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> Autres> Numéros> Séparateur de liste [remplacez la virgule par votre alternative préférée]. Cela signifie qu'Excel exportera également par défaut les fichiers CSV à l'aide du séparateur choisi.

0
user25307