2010-06-18 26 views
6

¿Cómo iría creando un esquema de tabla MYSQL inspeccionando un archivo Excel (o CSV)? ¿Hay alguna biblioteca de Python lista para la tarea?Generar esquema de tabla inspeccionando Excel (CSV) e importar datos

Los encabezados de columna se desinfectarán a los nombres de columna. El tipo de datos se estimará en función del contenido de la columna de la hoja de cálculo. Cuando termine, los datos se cargarán en la tabla.

Tengo un archivo de Excel de ~ 200 columnas que deseo comenzar a normalizar.

+0

Algunas ideas más: http://stackoverflow.com/q/9998596/395857 –

Respuesta

1

Solo para (mi) de referencia, lo documentado por debajo de lo que hice:

  1. XLRD es práctico, sin embargo he acabo de salvar los datos de Excel como CSV, por lo que puede utilizar LOAD DATA INFILE
  2. I' he copiado la fila de cabecera y comenzó a escribir el guión de importación y la normalización
  3. script hace: CREATE TABLE con todas las columnas en forma de texto, excepto la tecla MySQL
  4. consulta primaria: LOAD DATA LOCAL INFILE carga todos los datos CSV en campos de texto.
  5. según la salida de PROCEDURE ANALYSE, pude ALTER TABLE para dar a las columnas los tipos y longitudes correctos. PROCEDURE ANALYSE devuelve ENUM para cualquier columna con pocos valores distintos, que no es lo que necesitaba, pero me pareció útil más adelante para la normalización. Eye-balling 200 columnas era muy fácil con PROCEDURE ANALYSE. La salida de PhpMyAdmin proponía que la estructura de la tabla era basura.
  6. Escribí un poco de normalización sobre todo usando SELECT DISTINCT en columnas y INSERT resultados de ing para separar las tablas. He agregado a la tabla anterior una columna para FK primero. Justo después del INSERT, tengo su ID y UPDATE ed la columna FK. Cuando termine el bucle, he abandonado la columna anterior y solo he dejado la columna FK. Del mismo modo con múltiples columnas dependientes. Fue mucho más rápido de lo que esperaba.
  7. Ejecuto (django) python manage.py inspctdb, copié la salida a models.py y agregué todos esos ForeignkeyField s ya que los FK no existen en MyISAM. Escribió un poco views.py pitón, urls.py, algunas plantillas ... TADA
1

solución rápida y sucia con phpmyadmin:

  • crear una tabla con la cantidad adecuada de columnas. Asegúrese de que los datos se ajusten a las columnas.
  • Importe el CSV en la tabla.
  • Utilice la estructura propuesta de la tabla.
+1

De acuerdo, PhpMyAdmin hace: "SELECT * FROM table_name PROCEDURE ANALYZE()". Esto podría ayudarme. http://dev.mysql.com/doc/refman/5.0/en/procedure-analyse.html –

1

Por lo que sé, no hay ninguna herramienta que pueda automatizar este proceso (me encantaría que alguien me pruebe mal ya que he tenido este problema exacto antes). Cuando hice esto, me ocurrió con dos opciones:
(1) crear manualmente las columnas en el PP con los tipos apropiados y luego importar o
(2) algún tipo de filtro que podría "averiguar" qué tipos de datos deberían ser las columnas Fui con la primera opción principalmente porque no creía que pudiera escribir un programa para hacer la inferencia de tipo.
Si decide escribir una herramienta de conversión de tipo, aquí hay un par de cuestiones que puede tener que tratar:
(1) Las fechas de Excel se almacenan realmente como el número de días desde el 31 de diciembre de 1899; ¿Cómo se puede deducir entonces que una columna es fechas en oposición a algún dato numérico (población, por ejemplo)?
(2) Para campos de texto, ¿solo hace las columnas de tipo varchar (n) donde n es la entrada más larga en esa columna, o lo convierte en un campo char ilimitado si una de las entradas es más larga que alguna superior ¿límite? Si es así, ¿cuál es un buen límite superior?
(3) ¿Cómo se convierte automáticamente un flotador a un decimal con la precisión correcta y sin perder ningún lugar?
Obviamente, esto no significa que no podrá (soy un programador bastante malo). Espero que lo hagas, porque sería una herramienta realmente útil.

3

Utilice el módulo xlrd; start here. [Descargo de responsabilidad: soy el autor]. xlrd clasifica las celdas en texto, número, fecha, booleano, error, en blanco y vacío. Distingue las fechas de los números al inspeccionar el formato asociado a la celda (por ejemplo, "dd/mm/aaaa" frente a "0,00").

El trabajo de programar algún código para recorrer los datos ingresados ​​por el usuario para decidir qué tipo de datos de DB usar para cada columna no es algo que pueda automatizarse fácilmente. Debería poder analizar los datos y asignar tipos como números enteros, dinero, texto, fecha, fecha y hora, etc. y escribir el código para verificar sus conjeturas. Tenga en cuenta que necesita poder hacer frente a cosas como datos numéricos o de fecha ingresados ​​en campos de texto (puede verse bien en la GUI). Necesita una estrategia para manejar celdas que no se ajustan al tipo de datos "estimado". Necesita validar y limpiar sus datos. Asegúrate de normalizar las cadenas de texto (espacios en blanco al principio/al final de la tira, reemplaza varios espacios en blanco por un espacio. El texto de Excel es (solo BMP) Unicode; no lo pongas en ASCII o "ANSI"; trabaja en Unicode y codifica en UTF-8 para ponerlo en su base de datos.

Cuestiones relacionadas