¿Hay alguna manera de incluir comas en columnas CSV sin romper el formato?

283

Tengo un CSV de dos columnas con un nombre y un número. El nombre de algunas personas usa comas, por ejemplo, Joe Blow, CFA.esta coma rompe el formato CSV, ya que se interpreta como una nueva columna.

He leído y la receta más común parece ser reemplazar ese carácter, o reemplazar el delimitador, con un nuevo valor (por ejemplo this|that|the, other).

Realmente me gustaría mantener el separador de coma (sé que Excel es compatible con otros delimitadores, pero otros intérpretes pueden no). También me gustaría mantener la coma en el nombre, ya que Joe Blow| CFAparece bastante tonto.

¿Hay alguna manera de incluir comas en columnas CSV sin romper el formato, por ejemplo escapándolos?

buley
fuente
1
Posible duplicado de Manejo de comas en un archivo CSV
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Pequeño truco que funcionó para mí: abra el archivo csv en un editor de texto, luego péguelo en un documento de Excel. Funciona si puedes hacer esto en grandes trozos.
Jonas
@Jonas: Excel no puede adivinar si se usa el mismo token como delimitador o parte de los datos. Pegar desde un editor de texto no cambia eso.
Inspeccionable

Respuestas:

373

Encierre el campo entre comillas, p. Ej.

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

Ver wikipedia .

Actualizado :

Para codificar una cotización, use ", un símbolo de doble comilla en un campo se codificará como "", y todo el campo se convertirá """". Entonces, si ve lo siguiente en, por ejemplo, Excel:

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

el archivo CSV contendrá:

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

Una coma simplemente se encapsula utilizando comillas, por lo que se ,convierte ",".

Una coma y una cita deben ser encapsuladas y citadas, por lo que se ","convierte """,""".

Ryan
fuente
44
¡Esto funcionó para mí! Estaba exportando una variable js a CSV, y poner un par adicional de comillas alrededor de cada cadena, ayudó a resolver el problema de "John Blow, CFA", como se menciona en la pregunta.
Madhulika Mukherjee
¿Qué pasa si hay comillas y comas dentro de cada celda?
Speedplane
2
Actualicé la respuesta con algunos ejemplos: en resumen, las comas se encapsulan entre comillas (como ",") y las comillas se escapan (por ejemplo """)
Ryan
66
Ahora ESTA debería ser la respuesta aceptada, ya que propone una gran solución que probablemente resuelva el 99% de los casos de uso.
BuZz
¿Existe una biblioteca de C # para analizar archivos csv con campos de escape?
Minh Tran
34

El problema con el formato CSV es que no hay una especificación, hay varios métodos aceptados, sin ninguna forma de distinguir cuál debe usarse (para generar / interpretar). Discutí todos los métodos para escapar de los personajes (nuevas líneas en ese caso, pero la misma premisa básica) en otra publicación . Básicamente se trata de utilizar un proceso de generación / escape CSV para los usuarios previstos, y esperando que al resto no le importe.

Documento de especificaciones de referencia .

Rudu
fuente
10
RFC 4180, Formato común y tipo MIME para archivos de valores separados por comas (CSV), ietf.org/rfc/rfc4180.txt ; otra especificación 'oficial'.
Shi
3
Incluir el enfoque más ampliamente aceptado haría que esta sea una gran respuesta. Tal como está, la respuesta de @Ryan gana.
rinogo
16

Si quieres hacer lo que dijiste, puedes usar comillas. Algo como esto

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

ahora puede usar una coma en su variable de nombre.

Nube
fuente
Gracias Cloud por tu consejo, eso lo hizo: $whatever = "\"".$name."\"";
washere
Gracias por tu solución.
Bhavin Thummar
10

Necesita citar esos valores.
Aquí hay una especificación más detallada.

SLaks
fuente
2
Hay múltiples especificaciones, Excel usa comillas alrededor de la entrada, Linux usa el carácter de barra diagonal inversa. Desafortunadamente, necesita escapar para su público objetivo / sistema objetivo.
Rudu
7

Además de los puntos en otras respuestas: una cosa a tener en cuenta si está utilizando comillas en Excel es la ubicación de sus espacios. Si tiene una línea de código como esta:

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

Excel tratará la cita inicial como una cita literal en lugar de usarla para escapar de comas. Su código deberá cambiar a

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

Fue esta sutileza la que me trajo aquí.

hlongmore
fuente
3

Me enfrenté al mismo problema y citar el ,no ayudó. Finalmente, reemplacé el ,con +, terminé el procesamiento, guardé la salida en un archivo externo y reemplacé el +con ,. Esto puede parecer feo pero funcionó para mí.

Mahoma
fuente
2
¿Y qué hubiera hecho si los datos contuvieran caracteres "+"?
Andrew Morton
1
@ AndrewMorton Sí, eso es un desafío. Pero en mi caso, estoy seguro de que +no existe en absoluto en mis datos. Gracias por tu amable comentario.
Mohammed
44
La forma simple y robusta es encerrar las cadenas entre comillas dobles y escapar de las comillas dobles dentro de las cadenas usando dos de ellas como "". Esta es la forma normal de hacerlo.
Andrew Morton
1
Si no funciona, compruebe que no está generando espacios junto con las comas delimitadoras: "Rana", "amarillo, verde" funcionará "Rana", "amarillo, verde" no
Dazbert
Personalmente, encontré que el segundo comentario de @AndrewMorton aquí realmente me ayudó a entender qué hacer mejor que la respuesta aceptada. Paso 1: escapar de las comillas dobles en los campos de datos, por ejemplo, en Python: field = field.replace('"', '""')Paso 2: después del Paso 1, encierre el campo en comillas dobles, por ejemplo field = '"' + field + '"', entonces creo que está fundido en hierro.
Will Croxford
3

Dependiendo de su idioma, puede haber un método to_json disponible. Eso escapará a muchas cosas que rompen los CSV.

amiksch
fuente
3

Descubrí que algunas aplicaciones como Numbers en Mac ignoran la comilla doble si hay espacio antes.

a, "b,c"No funciona mientras a,"b,c"trabaja.

mudin
fuente
1
Probablemente me has ahorrado una hora de trabajo ... ¡gracias!
Shaun314
1

Puede codificar sus valores, por ejemplo en PHP base64_encode ($ str) / base64_decode ($ str)

OMI, esto es más simple que duplicar cotizaciones, etc.

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

Los valores codificados nunca contendrán una coma, por lo que cada coma en su CSV será un separador.

Kevin
fuente
1

Puede usar literales de plantilla (cadenas de plantilla)

p.ej -

`"${item}"`
सत्यमेव जयते
fuente
1
¡Trabajado como un encanto!
waliurjs
0

Puede utilizar el Text_Qualifiercampo en su administrador de conexión de archivos planos como ". Esto debería envolver sus datos entre comillas y solo separados por comas que están fuera de las comillas.

sakshi jain
fuente
0

Primero, si el valor del elemento tiene un carácter de comillas dobles ("), reemplácelo con 2 caracteres de comillas dobles (" ")

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

Finalmente, ajuste el valor del artículo:

A LA IZQUIERDA: con comillas dobles (")

A LA DERECHA: con comillas dobles (") y comas (,)

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

Las comillas dobles no funcionaron para mí, funcionaron para mí \". Si desea colocar comillas dobles como ejemplo, puede establecer\"\" .

Puedes construir fórmulas, como ejemplo:

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

escribirá en csv:

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

mathengineer
fuente
0

Puede que no sea lo que se necesita aquí, pero es una pregunta muy antigua y la respuesta puede ayudar a otros. Un consejo que encuentro útil al importar a Excel con un separador diferente es abrir el archivo en un editor de texto y agregar una primera línea como:

sep = |

donde | es el separador que desea que Excel use. Alternativamente, puede cambiar el separador predeterminado en Windows pero un poco largo:

Panel de control> Reloj y región> Región> Formatos> Adicional> Números> Separador de lista [cambie de coma a su alternativa preferida]. Eso significa que Excel también predeterminará la exportación de CSV utilizando el separador elegido.

usuario25307
fuente