2012-02-10 28 views
8

Tengo una pila de archivos CSV que quiero analizar: el problema es que la mitad tiene comillas usadas como comillas y comas dentro del campo principal. No son realmente CSV, pero sí tienen un número fijo de campos que son identificables. El dialecto = csv. "Excel" ajuste funciona perfectamente en los archivos con el extra "y, caracteres dentro del campo.Archivos CSV con caracteres de comas y comas dentro de los campos

Estos datos son de edad/no compatible. Estoy tratando de empujar un poco de vida en él.

por ejemplo

"AAAAA 
AAAA 
AAAA 
AAAA","AAAAAAAA 


AAAAAA 
AAAAA "AAAAAA" AAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAA, AAAAA 
AAAAAAAAA AAAAA AAAAAAAAAA 
AAAAA, "AAAAA", AAAAAAAAA 
AAAAAAAA AAAAAAAA 
AAAAAAA 
" 

esta es tropezar el analizador de archivos y genera un error _csv.Error: newline inside string. me narrrowed se reduce a esto es el problema quitando las comillas desde el interior del segundo campo y el módulo csv.reader analiza el archivo OK

Algunas de los campos son multilínea; no estoy seguro de si es importante saberlo.

He estado hurgando en la configuración del dialecto, y aunque puedo encontrar 'skipinitialspace', esto no parece resolver el problema.

Para que quede claro -. Esto no es válido 'CSV', sus objetos de datos que vagamente seguir una estructura CSV, pero tienen, y "caracteres dentro de la prueba de campo

El lineterminator es \ x0d \ x0a

he probado un número de diferentes personas va a permuations de comillas dobles y la variable citando en el módulo dialecto, pero no puedo conseguir este analiza correctamente.

no puede estar seguro de que una "o", combinación existe solo en los límites del campo.

Este problema solo existe para uno (el último) de varios campos en el archivo, y hay varios miles de archivos.

+3

CSV adecuado utiliza dos caracteres de comillas consecutivas ('" "') para escapar de un carácter de comillas en un campo entre comillas. Alternativamente, el campo podría estar sin comillas y no es necesario escaparse, aunque las comas y las líneas nuevas no pueden aparecer en dicho campo. Las comillas simples como esta no son normalmente válidas. ¿Es posible modificar las opciones del origen de sus datos CSV para ajustarse mejor a las expectativas de la mayoría de los otros lectores CSV (incluido Python)? – SingleNegationElimination

+1

Heredé los datos, y hay muchos ... Así que no puedo hacer nada excepto crear un analizador sintáctico que pueda separarlo de nuevo. –

+0

Los archivos no están dañados, está mal/mal estructurado como un archivo CSV."Heredé los datos" es la "excusa" exacta, eso es exactamente lo que sucede. Los datos son antiguos/abandonados, y quiero resucitarlos. –

Respuesta

3

no se me permite hacer comentarios todavía, así que voy a publicar como una respuesta ...

Suponiendo que está utilizando comas como el delimitador, ¿hay comas dentro de sus datos? De lo contrario, podría hacer un hallazgo masivo y reemplazar para duplicar todos los caracteres de comillas después del primero y antes de los últimos caracteres del campo antes del procesamiento de CSV.

+0

Lamentablemente, también hay comas en el texto del campo, pero creo que tendré que descartar el módulo csv para analizarlo. No puedo confiar en que no encuentre una combinación "o una" en el campo texto , que tipo de bustos la idea csv completa ... –

+0

Bueno, fue un pensamiento. Dentro de un cierto campo de datos para una base de datos aquí en mi trabajo, prohibí el uso de comas. Sin embargo, pude salí con la suya solo porque solo había 100 registros afectados en un archivo de 50,000 filas. – Herbie

+0

Es una buena idea, pero tengo varios miles de archivos, cada uno es bastante desconocido - espera - puedo hacerlo de esa manera - Sé más o menos dónde están los "caracteres legítimos" en el archivo - Puedo encontrarlos, reemplazarlos con dobles, y con suerte hacer un csv válido de esa manera. –

11

¿Has intentado pasar csv.QUOTE_NONE mediante la palabra clave quoting arg? Sin tener ningún código o datos para probar esto, no tengo forma de saber si esto realmente funciona en sus datos, pero parece funcionar con el fragmento que proporcionó.

>>> import csv 
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE) 
>>> for row in r: print row 
... 
['"A"', '"B"', '"ccc "ccccccc" cccccc"'] 
+0

Lo intenté, pero eso escupe todo el archivo dividido por espacios en blanco y otros desperdicios. Solo hay 7 elementos en la lista de csv, ese método da cientos. –

+0

@Jay Gattuso, en ese caso, realmente debería publicar más datos de ejemplo. ¿Qué delimitador usa el archivo? Si tiene comillas y comas dispersas a lo largo de los datos, debe usar un delimitador diferente. O bien, simplemente no es un archivo csv bien formado. – senderle

+0

El delimitador es una coma estándar, simplemente no está bien formado. Estoy empezando a pensar que podría haberlo pre-analizado, buscando las condiciones adecuadas y reemplazar las citas allí con dobles ... Pensé que para eso era el módulo del dialecto. Publicaría más ejemplos, pero no son datos compartibles. El problema es que es una mala csv, no es que sea "especial". –

2

Escribiría un convertidor que analizaría la csv inicial y produciría una válida. Posiblemente pueda usar ", o" \ n como el mecanismo para determinar el delimitador.

+0

Eso es tentador, pero los marcadores de campo válidos no siempre están en \ n límites, y el ", como una suposición válida de marcador CSV sería peligroso. –

Cuestiones relacionadas