¿Por qué una coma es un separador / delimitador de registros incorrectos en archivos CSV?

32

Estaba leyendo este artículo y tengo curiosidad por la respuesta adecuada a esta pregunta.

Lo único que se me ocurre es que, en algunos países, el separador decimal es una coma, y ​​puede haber problemas al compartir datos en CSV , pero no estoy realmente seguro de mi respuesta.

David Gasquez
fuente
66
Casi cualquier delimitador es mejor que una coma. La razón es que, cuando los archivos delimitados por comas se leen en algunas herramientas de análisis de datos, las comas pueden confundirse con signos de puntuación, lo que interrumpe el "diseño" de los campos o columnas.
Mike Hunter
33
Un cínico, al notar que este artículo es una pieza de soplo de SAS, podría sugerir que quizás SAS tiene problemas para procesar archivos CSV con comas :-).
whuber
3
@whuber: SAS (en mi experiencia) puede tener problemas con los archivos CSV, ya sea que tengan comas o no, lo que requiere una gran cantidad de codificación manual para cada cosa extraña que a SAS no le gusta.
Jeremy Miles
8
Hay una desesperación en la búsqueda de delimitadores cada vez más oscuros (tuberías, pilcrows, espinas ) que sugiere que acordar y seguir un estándar es realmente la única forma segura para que las personas intercambien datos en archivos de texto delimitados. Y un estándar universal debe permitir que se represente cualquier cadena de texto (como lo hace RFC4180), en lugar de basarse en el supuesto de que algunos no necesitarán ser y pueden ser puestos a otro trabajo.
Scortchi - Restablece a Monica
2
(a) A menudo importé archivos .csv con éxito. (b) Aconsejo a las personas que no usen .csv si tienen comas en sus datos. Estos no se contradicen entre sí. Es lamentable que (b) necesite explicación en algunos sectores.
Nick Cox

Respuestas:

33

La especificación del formato CSV se define en RFC 4180 . Esta especificación fue publicada porque

no existe una especificación formal, lo que permite una amplia variedad de interpretaciones de archivos CSV

Desafortunadamente, desde 2005 (fecha de publicación del RFC), nada ha cambiado. Todavía tenemos una amplia variedad de implementaciones. El enfoque general definido en RFC 4180 es encerrar los campos que contienen caracteres como comas entre comillas, sin embargo, esta recomendación no siempre se cumple con un software diferente.

El problema es que en varias configuraciones regionales europeas el carácter de coma sirve como punto decimal, por lo que escribe en 0,005lugar de 0.005. Sin embargo, en otros casos, se usan comas en lugar de espacios para señalar grupos de dígitos, por ejemplo 4,000,000.00(ver aquí ). En ambos casos, el uso de comas podría conducir a errores en la lectura de datos de archivos csv porque su software realmente no sabe si 0,005, 0,1hay dos números o cuatro números diferentes (vea el ejemplo aquí ).

Por último, pero no menos importante, si almacena texto en su archivo de datos, entonces las comas son mucho más comunes en el texto que, por ejemplo, punto y coma, por lo que si su texto no está entre comillas, esos datos también pueden leerse fácilmente con errores .

Nada hace que las comas sean mejores o peores separadores de campo en la medida en que los archivos CSV se utilizan de acuerdo con las recomendaciones como RFC 4180 que protegen de los problemas descritos anteriormente. Sin embargo, si existe el riesgo de usar el formato CSV simplificado que no encierra los campos entre comillas, o si la recomendación se puede usar de manera inconsistente, entonces otros separadores (por ejemplo, punto y coma) parecen ser un enfoque más seguro.

Tim
fuente
66
Bueno, cualquier software que implemente el estándar CSV real como se define en RFC 4180 ciertamente sabría exactamente cómo interpretar cualquier cadena dada. Sin ,embargo, el argumento de que usar en lugar de un separador más raro hincha los datos porque tienes que escapar de ellos todo el tiempo es cierto. Y, obviamente, están todas aquellas personas que piensan que saben cómo funciona el CSV pero realmente no lo saben.
Voo
2
@Voo Sí, pero debido a que los archivos "csv" se usan de manera tan caótica, es más seguro no usar comas y en su lugar usar otros separadores, por ejemplo, punto y coma. Esta es la respuesta a la pregunta de OP. No hay nada "mejor" en punto y coma (u otras no comas) en comparación con las comas, simplemente son una opción más segura en muchos casos.
Tim
2
@Voo +1 a tu comentario. Sin embargo, ¡a cualquiera que esté usando CSV realmente no le importan los archivos de datos hinchados!
whuber
17

Técnicamente, la coma es tan buena como cualquier otro personaje para ser usado como separador. El nombre del formato se refiere directamente a que los valores están separados por comas (valores separados por comas).

La descripción del formato CSV está usando una coma como separador.

Cualquier campo que contenga una coma debe estar entre comillas dobles. Por lo tanto, eso no causa problemas para leer datos. Vea el punto 6 de la descripción :

  1. Los campos que contienen saltos de línea (CRLF), comillas dobles y comas deben ir entre comillas dobles.

Por ejemplo, las funciones read.csvy write.csvde R por defecto usan una coma como separador.

djhurio
fuente
44
Esta es la mejor respuesta, ya que se refiere a valuesque están separados por comas. Otros que aluden a los formattingnúmeros europeos , este no es un problema para el csv standard, ya que cita correctamente el punto 6 anterior. Existen divergencias del "uso correcto" con cualquier formato de datos. El punto es: conoce tus datos. Otros mencionan tabo ;delimitan, sin embargo, estos pueden tener los mismos problemas que las comas cuando se trata de datos ingresados ​​por el usuario (tal vez a través de un formulario y capturados por una base de datos; he tenido que lidiar con campos de entrada de texto libre que las personas tener grasa en los dedos tab... apesta)
Adrian Torrie
La respuesta de Tim ahora se ha editado para incluir la información que @djhurio proporcionó.
Adrian Torrie el
11

Además de ser un separador de dígitos en números, también forma parte de la dirección (como la dirección del cliente, etc.) en muchos países. Si bien algunos países tienen direcciones cortas bien definidas, muchos otros tienen direcciones sinuosas que incluyen, a veces, dos comas en la misma línea. Los buenos archivos CSV encierran todos estos datos entre comillas dobles. Pero los analizadores excesivamente simplistas y mal escritos no permiten leer y diferenciarlos. (Luego, está el problema de usar comillas dobles como parte de los datos, como la cita de un poema).

Whirl Mind
fuente
2
(+1) El estándar prevé el uso de comillas dobles como parte de los datos al insistir en duplicarlos nuevamente: "Belloc", "Tarantella", "" "las pulgas que provocan en los Altos Pirineos" "". En Inglaterra no es raro encontrar campos de direcciones que contienen el nombre de una casa entre comillas, por lo tanto: "Chatsworth", Melton Road, Leamington. (No está claro por qué: Fowler se quejó de que "la implicación parece ser: vivir en la casa que la gente sensata llama '164 Melton Road', pero a un tonto le gusta llamar 'Chatsworth'".)
Scortchi - Restablecer a Monica
1
@Scortchi Parece que aprendimos los mismos poemas a los 12 años (error +/-). Me temo que lo que leí como escandaloso esnobismo inglés de principios del siglo XX de la clase media alta por los hábitos de la clase media baja oscurece su último ejemplo, que no será transparente más allá de un grupo pequeño.
Nick Cox
@ NickCox: Doce sonidos sobre lo correcto. Es curioso que no pueda recordar si he leído algún poema este año, y mucho menos recordar alguna frase de ellos. Aunque el punto de Fowler era sobre el efecto en el lector de las comillas innecesarias (vea innecesariamente citas.com ), creo que tiene razón al ver la influencia del esnobismo en su elección de ejemplo. En cualquier caso, espero que el punto bastante menor de que sea algo a tener en cuenta si alguna vez se le envía un archivo CSV que contiene direcciones en inglés es claro para todos a pesar de mis divagaciones.
Scortchi - Restablece a Monica
1
En la India, es común que las personas que construyen sus primeras casas (no apartamentos) mantengan un nombre florido innovador, a menudo en un idioma vernáculo o una frase sánscrita y que están entre comillas dobles, como "Guru Kripa". Nombres como Genelia D'Souza y Derek O'Brien también son comunes. Luego, las direcciones que dicen: "Puerta vieja No. nnn / Puerta nueva No. mm / c", debido a la renumeración gubernamental complican aún más el almacenamiento de direcciones, por tener barras y comillas simples en rincones inesperados.
Whirl Mind
@WhirlMind: Eso es interesante, he notado un montón de, bueno, más de lo que esperaba, nombres de casas gaélicos y galeses escoceses en Inglaterra, que es quizás el equivalente más cercano a elegir un idioma vernáculo para nombrar su hogar.
Scortchi - Restablece a Monica
9

Si bien la respuesta de @Tim es correcta, me gustaría agregar que "csv" en su conjunto no tiene un estándar común, especialmente las reglas de escape no están definidas en absoluto, lo que lleva a "formatos" que son legibles en un programa, pero no en otro . Esto se ve exaltado por el hecho de que cada "programador" bajo el sol simplemente piensa "oooh csv- ¡Construiré mi propio analizador!" y luego pierde todos los casos límite.

Además, csv carece por completo de la habilidad para almacenar metadatos o incluso el tipo de datos de una columna, lo que lleva a varios documentos que debe leer para comprender los datos.

Christian Sauer
fuente
55
Sí, hay herramientas estándar.ietf.org/ html / rfc4180 y muchos otros formatos no almacenan metadatos, simplemente no están diseñados para almacenar metadatos: los archivos .txt tampoco almacenan metadatos sobre documentos de texto ...
Tim
44
Tim, ese estándar se ignora la mayoría de las veces, por lo que no es estándar ,,,
Christian Sauer
8
Lo mejor de los estándares es que hay muchos para elegir. (Varias mutaciones y atributos.)
Nick Cox
4

Si puede deshacerse del delimitador de coma y usar un carácter de tabulación, tendrá mucho más éxito. Puede dejar el archivo llamado .CSV e importarlo a la mayoría de los programas no suele ser un problema. Simplemente especifique TAB delimitado en lugar de coma cuando importe su archivo. Si hay comas en sus datos, tendrá un problema cuando especifique comas delimitadas, como ya sabe.

Gorila
fuente
55
Si hay pestañas en sus datos, se aplica lo contrario. Es solo, al menos en mi experiencia, menos probable.
Nick Cox
@Nick and Gorilla: He tenido buenos resultados |como delimitador en archivos de texto de tipo csv elaborados en casa (con títulos de libros y otros metadatos de documentos). |nunca aparece en los datos con los que trabajo, por lo que puedo escribir scripts en perl que simplemente se dividen / unen sin verificar citas de ningún tipo. Esto fue para un proyecto único que solo involucra el procesamiento de metadatos guardados desde una base de datos de MS Access. Para cualquier proyecto más grande, o si planea mantener los datos en este formato de archivo a largo plazo, ¡elija algo más robusto! Siempre podría modificar algo si el lote de este mes rompió algo.
Peter Cordes
@ PeterCordes Te creo, y lo que sea que funcione. Pero claramente el costo de los separadores idiosincrásicos puede ser la necesidad de explicarlos a otros y es clave que puedan importar dichos archivos de datos sin dificultad. Frente a un formato de archivo inusual, es necesario tener acceso a alguna rutina, función o comando que pueda dividir cadenas en separadores arbitrarios.
Nick Cox
@PeterCordes Cuando escribí un splitcomando para Stata miré, entre otras cosas, el equivalente de Perl para ver qué hacía y qué no hacía. No es el código fuente, solo la funcionalidad ofrecida.
Nick Cox
1
@ NickCox: muchas funciones de Perl están bastante bien diseñadas, en mi opinión. Realizan el trabajo sin muchas limitaciones especiales como las que se encuentran en awk (que a menudo es bueno), o especialmente. otras herramientas de Unix cut, sorty uniq.
Peter Cordes
4

ASCII nos proporciona cuatro caracteres "separadores", como se muestra a continuación en un fragmento de la página de manual ascii (7) * nix:

   Oct   Dec   Hex   Char
   ----------------------
   034   28    1C    FS  (file separator)
   035   29    1D    GS  (group separator)
   036   30    1E    RS  (record separator)
   037   31    1F    US  (unit separator)

Esta respuesta proporciona una descripción general decente de su uso previsto.

Por supuesto, estos códigos de control carecen de la amabilidad humana (legibilidad y entrada) de los delimitadores más populares, pero son opciones aceptables para el intercambio interno y / o efímero de datos entre programas.

Ronald Straight
fuente
2
Interesante. Sin embargo, creo que nunca he visto estos usados ​​en la naturaleza ...
Matt Krause
4

El problema no es la coma; El problema es la cita. Independientemente del registro y delimitadores de campo que use, debe estar preparado para cumplirlos en el contenido. Entonces necesita un mecanismo de cotización. Y ENTONCES, también necesita una forma para que aparezcan los caracteres de cita

Seguir el estándar RFC 4180 simplifica todo para todos.

Personalmente, tuve que escribir un script para probablemente corregir la salida de un programa que hizo esto mal, así que soy un poco militante al respecto. "probablemente arreglar" significa que funcionó para MIS datos, pero puedo ver situaciones en las que podría fallar. (En defensa de ese programa, fue escrito antes del estándar).

Stig Hemmer
fuente