Pregunta

Tengo archivos CSV con el siguiente formato:

CSV FILE
"a"             , "b"     , "c" , "d"
hello, world    , 1       , 2   , 3
1,2,3,4,5,6,7   , 2       , 456 , 87
h,1231232,3     , 3       , 45  , 44

El problema es que el primer campo tiene comas "" en el mismo. No tengo ningún control sobre la generación de archivos, ya que es el formato de las recibo en. ¿Hay una manera de leer un archivo CSV hacia atrás, desde el final de la línea al principio?

No me importa escribir un pequeño script en Python para hacerlo, si me guío en la dirección correcta.

¿Fue útil?

Solución

El método de cadena rsplit divide una cadena a partir de la derecha en vez de la izquierda, por lo que es probablemente lo que usted está buscando (que toma un argumento que especifica el número máximo de veces para dividir):

line = "hello, world    , 1       , 2   , 3"
parts = line.rsplit(",", 3)
print parts  # prints ['hello, world    ', ' 1       ', ' 2   ', ' 3']

Si desea despojar a los espacios en blanco del principio y final de cada elemento de la lista, partida, a continuación, puedes usar el método strip con una lista por comprensión

parts = [s.strip() for s in parts]
print parts  # prints ['hello, world', '1', '2', '3']

Otros consejos

No entiendo del todo por qué desea leer cada línea a la inversa, pero se puede hacer esto:

import csv
file = open("mycsvfile.csv")
reversedLines = [line[::-1] for line in file]
file.close()
reader = csv.reader(reversedLines)
for backwardRow in reader:
    lastField = backwardRow[0][::-1]
    secondField = backwardRow[1][::-1]

Invertir la cadena primero y luego procesarlo.

tmp = tmp [:: - 1]

A partir de la muestra que ha proporcionado, parece que el tamaño "columnas" son fijos. En primer lugar (el uno con comas) es de 16 caracteres de largo, así que por qué no tratas de leer el archivo línea por línea, a continuación, para cada línea de la lectura de los primeros 16 caracteres (como un valor de la primera columna), y el resto en consecuencia? Después de que haya cada valor, se puede ir y analizar más a fondo (espacios en blanco de acabado, y así sucesivamente ...).

Eso no es entonces un archivo CSV, coma medios separados sólo eso.

¿Cómo puede estar seguro de que no es:

CSV FILE
"a"             , "b"     , "c" , "d"
hello           , world   , 1   , 2   , 3
1               , 2       , 3   , 4   , 5,6,7,2,456,87
h               , 1231232 , 3   , 3   , 45,44

Si el archivo es como se indica a continuación, el primer grupo debe estar entre comillas, parece que los nombres de campo son tan extraño que los campos que contienen comas no lo son.

No soy un fan de los errores de fijación de distancia de su fuente, me empujo de vuelta al generador de datos para entregar CSV adecuada si eso es lo que están reclamando que es.

Siempre se puede hacer algo con de expresiones regulares, como (expresiones regulares Perl)

#!/usr/bin/perl

use IO::File;

if (my $file = new IO::File("test.csv"))
{
    foreach my $line (<$file>) {
    $line =~ m/^(.*),(.*?),(.*?),(.*?)$/;
    print "[$1][$2][$3][$4]\n";
    }
} else {
    print "Unable to open test.csv\n";
}

(La primera es una búsqueda codiciosa, el último 3 no lo son) Editar ha escrito código completo en lugar de sólo la expresión regular

Si siempre espera el mismo número de columnas, y sólo la primera columna puede contener comas, acabo de leer cualquier cosa y concatenar el exceso de columnas al principio.

El problema es que la interfaz es ambigua, y se puede tratar de evitar esto, pero la mejor solución es tratar de obtener la interfaz fijo (que a menudo es más difícil que crear varios parches ...).

Estoy de acuerdo con la cerveza mr. Esto es un archivo csv mal formado. Su mejor apuesta es encontrar otros delimitadores o detener la sobrecarga del comas o presupuesto / escapar del campo no comas separando

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