Pregunta

Tengo una sencilla aplicación que se abre un archivo de texto delimitado por tabuladores, y se inserta esos datos en una base de datos.

Estoy usando este lector CSV para leer los datos: http: // www .codeproject.com / KB / base de datos / CsvReader.aspx

Y todo está funcionando bien!

Ahora mi cliente ha añadido un nuevo campo al final del archivo, que es "ClaimDescription", y en algunas de estas descripciones de reclamación, los datos tienen cotizaciones en ella, ejemplo:

  

"SUMISEI MARU NO 2" - mar de Japón

Esta parece ser la causa de un dolor de cabeza para mi aplicación. Consigo una excepción que se parece a esto:

  

El CSV parece estar dañado cerca de registro '1470' '26 campo en la posición '181'. datos en bruto actual: ...

Y en ese "datos brutos", lo suficientemente seguro de que el campo de descripción de reclamación muestra los datos con citas en el mismo.

Quiero saber si alguien ha tenido este problema antes, y tengo alrededor de ella? Obviamente, puede pedir al cliente para cambiar los datos que originalmente envían a mí, pero esto es un proceso automático que utilizan para generar el archivo delimitado por tabuladores; y yo prefiero usar eso como un último recurso.

Estaba pensando que tal vez podría abrir el archivo utilizando un estándar antes TextReader parte, escapar de las comillas, escribir el contenido de nuevo en un nuevo archivo, y luego alimentar a ese archivo en el Lector CSV. Es probable que vale la pena mencionar que el tamaño promedio de archivo de estos archivos delimitados por tabuladores es de alrededor de 40 MB.

Cualquier ayuda es muy apreciada!

Saludos, Sean

¿Fue útil?

Solución 7

derecho - después de una noche de redbull y rascándome la cabeza, al final encontré el problema, era comas en el campo "Claim_Description". Ni siquiera pensar en eso porque estaba usando un archivo delimitado por tabuladores, pero tan pronto como lo hice un buscar y reemplazar en todas las comas en el archivo funcionó absolutamente bien!

El siguiente paso es averiguar cómo reemplazar esos comas antes de procesar.

Una vez más, gracias por todas las sugerencias.

Saludos, Sean

Otros consejos

Compruebe el comentario en el artículo CodeProject sobre cotizaciones:

http: //www.codeproject .com / Mensajes / 3382857 / Re-cotizaciones en el interior-of-the-Field.aspx

Es necesario especificar en el constructor que desea otro personaje además de "para ser utilizado como cotizaciones.

Utilice los href="http://www.filehelpers.com/" rel="nofollow FileHelpers biblioteca en lugar. Es ampliamente utilizado y hará frente a los campos citados, o campos que contienen comillas.

He resuelto recientemente un problema similar, y aunque CSVReader funcionaba correctamente en todos menos en unas pocas líneas de mi archivo TSV, lo que resolvió mi problema, al final se ponía un customDelimiter en el constructor de CsvReader

public static void ParseTSV(string filepath)
    {
        using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) {
        //if that didn't work, passing unlikely characters into the other params might help
        //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) {
            int fieldcount = csvReader.FieldCount;

            //Does not work, since it's read only property
            //csvReader.Delimiter = "\t";

            string[] headers = csvReader.GetFieldHeaders();

            while (csvReader.ReadNextRecord()) {
                for (int i = 0; i < fieldcount; i++) {
                    string msg = String.Format("{0}\r{1};", headers[i],
                                               csvReader[i]);
                    Console.Write(msg);
                }
                Console.WriteLine();
            }
        }
    }

Tal vez se puede abrir el archivo con su aplicación y reemplazar cada cita con otro personaje y luego procesarlo.

Lo hice un poco de búsqueda, y no hay un RFC para los archivos CSV ( RFC 4180 ) y que prohíbe explícitamente lo que están haciendo:

  

Cada campo puede o no estar entre comillas dobles (sin embargo   algunos programas, como Microsoft Excel, no utilizan comillas dobles   en absoluto). Si los campos no están encerrados entre comillas dobles, a continuación,   comillas dobles no pueden aparecer dentro de los campos.

Básicamente, si quieren hacer eso, tienen que encerrar todo ese campo entre comillas, así:

,""SUMISEI MARU NO 2" - sea of Japan",

Así que si quieres puedes lanzar este problema atrás en ellos e insistir en que le envían un archivo CSV "adecuada" RFC 4180.

Dado que usted tiene acceso a los archivos de origen para ese lector CSV, otra opción sería la de modificarlo para manejar el tipo de cadenas entre comillas que se están alimentando.

Este tipo de situación es exactamente por eso que es vital tener acceso al código fuente a su conjunto de herramientas.

Si por el contrario desea preproceso (corte) de sus archivos antes de feeing a su herramienta, el método correcto sería buscar para los campos con una cita no inmediatamente delante o detrás de un separador, y adjuntar toda su campo en otro conjunto de comillas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top