2011-01-06 12 views
94

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.¿Hay alguna manera de incluir comas en columnas CSV sin romper el formato?

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

Me gustaría guardar el separador de comas (sé que Excel admite otros delimitadores, pero otros intérpretes pueden no). También me gustaría mantener la coma en el nombre, ya que Joe Blow| CFA parece bastante tonto.

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

+0

Posible duplicado de [Tratar con comas en un archivo CSV] (http://stackoverflow.com/questions/769621/dealing-with-commas-in-a-csv-file) –

+0

Pequeño truco que funcionó para mí: abra el archivo csv en un editor de texto y luego péguelo en un documento de Excel. Funciona si puedes hacer esto en grandes porciones. – Jonas

+0

@Jonas: Excel no puede adivinar si el mismo token se usa como un delimitador o como parte de los datos. Pegar desde un editor de texto no cambia eso. – IInspectable

Respuesta

21

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

Reference spec document.

+2

RFC 4180, formato común y tipo MIME para Coma -Los archivos de valores separados (CSV), https://www.ietf.org/rfc/rfc4180.txt; una especificación más "oficial". – Shi

8

Debe citar esos valores.
Here es una especificación más detallada.

+2

Hay varias especificaciones, Excel usa comillas alrededor de la entrada, Linux usa la barra invertida. Lamentablemente, debe escapar para su público objetivo/sistema de destino. – Rudu

90

Incluya el campo entre comillas, p. Ej.

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

Ver wikipedia.

Actualizado:

para codificar una cita, utilice ", un solo símbolo cita en un campo se codifica como "", y todo el campo se convertirá en """". Por lo tanto, si ve lo siguiente en, por ejemplo, Excel:

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

el archivo CSV incluye:

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

Una coma se encapsula el simple uso de cotizaciones, por lo que se convierte en ,",".

Un comando y presupuesto deben ser encapsulados y citados, por lo que "," se convierte en """,""".

+2

¡Esto funcionó para mí! Estaba exportando una variable js a CSV, y poniendo un par de comillas adicionales en cada cadena, ayudó a resolver el problema de "John Blow, CFA", como se menciona en la pregunta. –

+0

¿Qué sucede si hay comillas y comas dentro de cada celda? – speedplane

+0

Actualicé la respuesta con algunos ejemplos: en resumen, las comas se encapsulan entre comillas (como '", "'), y las comillas se escapan (por ejemplo '" "" ') – Ryan

0

Puede usar el campo Text_Qualifier en su administrador de conexión de archivos planos como ". Esto debe ajustar sus datos en cotizaciones y solo separarlas por comas que están fuera de las comillas.

6

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 usted tiene una línea de código como este:

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

Excel tratará el presupuesto inicial como una cita literal en lugar de usarlo para escapar comas. Su código tendrá que cambiar a

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

Fue esta sutileza que me trajo aquí.

6

Si quiere hacer lo que dijo, puede usar comillas. Algo como esto

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

así que ahora, puede usar la coma en su variable de nombre.

+0

Gracias a la nube por tu consejo, que lo hizo: '$ whatever =" \ "". $ name. "\" ";' – washere

1

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

+1

¿Y qué hubieras hecho si los datos contuvieran caracteres "+"? –

+1

@AndrewMorton Sí, eso es un desafío. Pero en mi caso, estoy seguro de que '+' no existe en mis datos. Gracias por su amable comentario – Mohammed

+2

La manera 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 '" "'. Esto es la forma normal de hacerlo. –

0

En primer lugar, si el valor del artículo tiene carácter de comillas dobles ("), reemplace con 2 carácter de comillas dobles (" ")

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

Finalmente, envuelva valor del artículo:

A LA IZQUIERDA: Con comillas dobles personaje (")

A LA DERECHA: Con carácter de comillas dobles (") y el carácter coma (,)

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

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

Cuestiones relacionadas