Estoy procesando datos de fuentes gubernamentales (FEC, bases de datos de votantes estatales, etc.). Está inconsistentemente mal formado, lo que rompe mi analizador CSV en todo tipo de formas deliciosas.¿Cómo puedo analizar robustamente CSV con formato incorrecto?
Es de origen externo y autorizado. Debo analizarlo, y no puedo volver a ingresarlo, validarlo en la entrada ni nada por el estilo. Es lo que es; No controlo la entrada.
Propiedades:
- campos que contienen malformado UTF-8 (por ejemplo
Foo \xAB bar
) - El primer campo de una línea especifica el tipo de registro de un conjunto conocido. Conociendo el tipo de registro, usted sabe cuántos campos hay y sus respectivos tipos de datos, pero no hasta que lo haga.
- Cualquier línea dentro de un archivo puede usar cadenas entre comillas (
"foo",123,"bar"
) o sin comillas (foo,123,bar
). Todavía no he encontrado ningún lugar donde se mezcle dentro de una línea determinada (es decir,"foo",123,bar
), pero probablemente esté ahí. - Las cadenas pueden incluir caracteres internos de nueva línea, comillas y/o comas.
- Las cadenas pueden incluir números separados por comas.
- Los archivos de datos pueden ser muy grandes (millones de filas), por lo que es necesario que sigan siendo razonablemente rápidos.
Estoy usando Ruby FasterCSV (conocido simplemente como CSV en 1.9), pero la pregunta debe ser independiente del idioma.
Supongo que una solución requerirá una sustitución de preprocesamiento con caracteres de separador de registro/comillas inequívocos (por ejemplo, ASCII RS, STX). Empecé un poco here pero no funciona para todo lo que obtengo.
¿Cómo puedo procesar este tipo de datos sucios con solidez?
ETA: He aquí un ejemplo simplificado de lo que puede ser en un solo archivo:
"this","is",123,"a","normal","line" "line","with "an" internal","quote" "short line","with an "internal quote", 1 comma and linebreaks" un "quot" ed,text,with,1,2,3,numbers "quoted","number","series","1,2,3" "invalid \xAB utf-8"
Nada aquí realmente parece como CSV con formato incorrecto. ** 1 ** es problemático si los caracteres escapados reemplazan comas o comillas, pero no sugirió que ese sea el caso. ** 2 ** es increíble, es solo otro campo. ** 3 ** Legal csv - los campos pueden ser envueltos con comillas. ** 4 ** De nuevo, csv legal, siempre que se salgan las comillas: '" "'.** 5 ** No hay problema, igual que * 4 *. ** 6 ** Solo es un problema si intenta leer o analizar todo de una vez. Entonces, mientras su analizador pueda manejar filas de diferentes longitudes, debería estar bien. ¿Tiene un ejemplo de dónde es realmente CSV inválido? (el enlace muestra un problema con las comillas) – Kobi
Por cierto, una búsqueda rápida encuentra esto: http://www.fec.gov/support/DataConversionTools.shtml (sí, me llevó 20 minutos pensar "tal vez alguien lo haya hecho" que antes ") – Kobi
¿Podemos ver fragmentos de los bits que el analizador CSV de Ruby no puede manejar? –