2011-01-18 18 views
5

Tengo un archivo CSV (que no diseñé y no puedo cambiar ahora ni nunca podré cambiarlo) que contiene líneas como las siguientes:División de cadena en comas cuando los datos pueden contener comas

"Surname, Firstname", yes, no, somestring, whatever, etc

Como se puede ver aquí, la primera , no es una coma en el que me gustaría dividir la cadena. Tenga en cuenta que esta coma en particular está dentro de las comillas.

Debido a esto, un simple string.split(','), obviamente, no va a funcionar, ya que me daría una matriz de longitud 7 para la cadena anterior en lugar de 6.

¿Hay alguna forma de evitar esto? Estaba pensando usar regex para dividir la cadena, pero no soy lo suficientemente competente en expresiones regulares para pensar en un patrón que solo se divida en comas que no están entre comillas.

Puedo pensar en maneras feas y hacky de hacerlo leyendo cada cadena char por char, pero esto tendría que ser un último recurso, ¡ya que estoy seguro de que hay una mejor manera de hacerlo!

+0

Esto parece un .csv de Excel. Siempre divertido. Más divertido es cuando los datos contienen comillas y comas ... –

+0

No es realmente de Excel, pero sí, ¡divertido! :) Es desde una ubicación en la red, mi programa lee el archivo e intenta analizarlo. – AndrewC

+1

Leer un carácter a la vez no es necesariamente un hack feo. Recomiendo encontrar un analizador de C# CSV, ya que estoy seguro de que tales cosas ya existen. –

Respuesta

1

Sé que hay muchas personas aquí que piensan que las comparaciones carácter por carácter nunca deberían usarse y estarán en total desacuerdo conmigo, pero no estoy convencido de que compañías como Microsoft no sean las únicas que deberían estar haciendo eso tipo de programación.

Después de todo, Split realiza comparaciones carácter por carácter, así que ¿por qué es menos feo cuando llamas a un código existente que no hace exactamente lo que quieres?

En cualquier caso, mi enfoque era escribir mi propio código. Y he publicado el código en línea en http://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-c.

+0

Gracias Jonathan. Estoy un poco confundido sobre cómo usar tu código, no estoy seguro de por qué necesito pasar un parámetro a ReadRow()? – AndrewC

+0

El parámetro se llena con la lectura de datos. –

+0

¡Funcionó a la perfección! Gracias Jonathan. – AndrewC

5

Puede manejar esto fácilmente usando el TextFieldParser class. Simplemente configure HasFieldsEnclosedInQuotes como verdadero.

+0

Hace referencia a una clase visual básica de .NET 4.5 cuando esto se publicó como una pregunta de C#. – aggaton

+2

@aggaton El hecho de que el tipo esté en el espacio de nombres Microsoft.VisualBasic, no significa que no se pueda usar desde C#. 'TextFileParser' funciona muy bien desde C#, y es parte del marco central; no hay razón para evitarlo. –

+0

@ReedCopsey es 'TextFieldParser', sin embargo,' TextFileParser'. Logró establecer un vínculo con lo correcto, pero lo escribe de forma incorrecta. – Nyerguds

2

Sugeriría utilizar una biblioteca de análisis CSV; hay otros casos en los que no se habría pensado (línea nueva como parte de un campo entre comillas).

El espacio de nombres VisualBasic tiene una buena biblioteca que puede ayudar - el TextFieldParser.

+1

Los desarrolladores de C# no deberían preocuparse por el espacio de nombres de VisualBasic. Significa nada IRL, no agrega dependencias que no están en la máquina, etc. – Will

+0

Hermosa, y como @Will dijo, funciona bien cuando se usa en C#. ¿Por qué Microsoft esconde herramientas como esta en lugares tan extraños? – Nyerguds

Cuestiones relacionadas