Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] obtener datos de una csv.

Estas en el tema de obtener datos de una csv. en el foro de Python en Foros del Web. Hola compañeros, les escribo a ver si me pueden orientar un poco con este caso que se me a presentado. El caso es que tengo ...
  #1 (permalink)  
Antiguo 17/07/2013, 02:26
Avatar de wolvelopez  
Fecha de Ingreso: junio-2008
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 0
obtener datos de una csv.

Hola compañeros, les escribo a ver si me pueden orientar un poco con este caso que se me a presentado.

El caso es que tengo un archivo csv separado por comas de este tipo:



CODIGO|NOMBRE|FAMILIA|DESCRIPCIÓN|PVP



Necesito extraer las familias para insertarlas en la base de datos, pero las familias están de esta manera:




CODIGO|NOMBRE|FAMILIA,SUBFAMILIA,SUBFAMILIA|DESCRI PCIÓN|PVP



Lo primero es saber si la subfamilia ya esta dada de alta y sinó la doy de alta pero antes debo de saber si su subfamilia padre esta dada de alta y sino darla porque las subfamilias dependen de las subfamilias padre o de las familias padre.....etc... no se si me explico bien.

¿se os ocurre alguna manera de hacer esto?...Había pensado en una especio de matriz con dos dimensiones pero no se si será la mejor opción y a parte siempre me lio mucho con las matrices.



Saludos y gracias de antemano.
__________________
# "El software es un gas: se expande hasta llenar su contenedor"
-- Nathan Myhrvold
  #2 (permalink)  
Antiguo 17/07/2013, 09:19
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: obtener datos de una csv.

Lo primero, usa el módulo csv con los parámetros correctos para reconocer | como separador.

Para las familias, una prueba de si la familia existe en la BBDD previo a insertar la subfamilia debería ser suficiente, el modo exacto depende de si estás usando un ORM. Si la jerarquía está ordenada (es decir, la lista es siempre padre,hijo,nieto,...), puede ser algo como

Código Python:
Ver original
  1. familia = fila[3].split(',') # donde 'fila' es la línea leída por el csv.reader
  2. for f in familia:
  3.     if no existe en la bbdd:
  4.         insertar


Saludos.
  #3 (permalink)  
Antiguo 17/07/2013, 09:43
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: obtener datos de una csv.

Si pusieras parte de cvs te podría ayudar mejor. Y como esta tus tablas en la db. Voy asumir muchas cosas espero que concuerde un poco con lo que tratas de hacer.

Código Python:
Ver original
  1. import csv
  2. with open("input.txt", "rb") as f:
  3.     reader = csv.reader(f)
  4.     next(reader) # Asumiendo que la primer linea son headers
  5.     data = [i[:2] + i[2].split(",") + i[3:] for i in reader]
  6.  
  7. padres = set()
  8. hijos  = set()
  9. familias = set()
  10. for i in data:
  11.     familia, padre, hijo = i[2], i[3], i[4]
  12.     padres.add(padre)
  13.     hijos.add((padre, hijo))
  14.     familias.add((familia, padre, hijo))
  15.  
  16. for padre in padres:
  17.     # Inserta los padres
  18.     pass
  19.  
  20. for padre, hijo in hijos:
  21.     # Inserta los hijos
  22.     pass
  23.  
  24. for familia, padre, hijo in familias:
  25.     # Inserta las familias
  26.     pass
La verdad no tengo idea de como sea el esquema de tu db. Supongo que la única parte que puede variar es la de los padres ya que solo te interesa padres que no tengan padres.
  #4 (permalink)  
Antiguo 18/07/2013, 02:07
Avatar de wolvelopez  
Fecha de Ingreso: junio-2008
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: obtener datos de una csv.

Muchas gracias, pongo un ejemplo del csv.

12245421|Protex x2|registros,registros_data,reg,fuente|control de registros
15455523|Protex x3|reg, data_info|Subcontrol de totales

Como veis, un registro puede tener de 1 a N subfamilias. Ese es mi problema. el caso de guardarlo en la bbdd de momento no me crea problema pero por orden debo de meterlo antes en alguna lista o diccionario o etc para posteriormente darlo de alta.

Necesitaria tener ordenadas las familias por ejempo en una lista, asi comprobaría al leer cada producto que las familias están o no en la lista, y si no están darlas de alta, y si es subfamilia que quede por debajo de la familia padre para después que se de el alta fácil en la bbdd de solo las familias y subfamilias, ya que los registros vendrían después.

No se si me explico
__________________
# "El software es un gas: se expande hasta llenar su contenedor"
-- Nathan Myhrvold
  #5 (permalink)  
Antiguo 22/07/2013, 01:29
Avatar de wolvelopez  
Fecha de Ingreso: junio-2008
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: obtener datos de una csv.

Al final trabajé con Listas y dentro de estas, mas listas.
Muchas gracias por todo.
Saludos.
__________________
# "El software es un gas: se expande hasta llenar su contenedor"
-- Nathan Myhrvold

Etiquetas: csv
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:48.