Crear una tabla a partir de un archivo CSV con encabezados

12

Estoy buscando encontrar una manera de generar una nueva tabla MySQL basada únicamente en el contenido de un CSV especificado. Los archivos CSV que usaré tienen las siguientes propiedades;

  • "|" delimitado
  • La primera fila especifica los nombres de columna (encabezados), también "|" delimitado
  • Los nombres y el orden de las columnas no son fijos.
  • El número de columnas no es fijo.
  • Los archivos son de gran tamaño (1 mil filas / 50 columnas).

En Excel, todo esto es bastante simple, sin embargo, con MySQL no parece serlo (sin suerte con Google). ¿Alguna sugerencia sobre lo que debería estar mirando?

usuario58602
fuente

Respuestas:

10

Puede usar csvsql , que es parte de csvkit(un conjunto de utilidades para convertir y trabajar con archivos CSV):

  • Linux o Mac OS X
  • fuente libre y abierta
  • sudo pip install csvkit
  • Ejemplo: csvsql --dialect mysql --snifflimit 100000 datatwithheaders.csv > mytabledef.sql
  • Crea una CREATE TABLEdeclaración basada en el contenido del archivo. Los nombres de columna se toman de la primera línea del archivo CSV.
Franck Dernoncourt
fuente
2

Si está de acuerdo con el uso de Python, Pandas funcionó muy bien para mí (csvsql colgado para siempre y menos cols y filas que en su caso). Algo como:

from sqlalchemy import create_engine
import pandas as pd

df = pd.read_csv('/PATH/TO/FILE.csv', sep='|')
# Optional, set your indexes to get Primary Keys
df = df.set_index(['COL A', 'COL B'])

engine = create_engine('mysql://user:pass@host/db', echo=False)

df.to_sql(table_name, engine, index=False)
ivansabik
fuente
¿Dónde se define dwh_engine? ¿Es esto un error tipográfico y quieres decir engine?
joanolo
Sí, debería ser engine! Se corrigió la respuesta gracias por detectar
ivansabik
to_sql ocupa demasiado tiempo si el número de filas es alto. Para nosotros, alrededor de 36000 filas tomaron alrededor de 90 minutos. Una declaración de carga directa se realizó en 3 segundos.
mvinayakam
0

Debe generar una TABLA DE CREACIÓN basada en los tipos de datos, el tamaño, etc. de las distintas columnas.

Luego usa CARGAR DATOS DE DATOS ... CAMPOS TERMINADOS POR '|' LÍNEAS TERMINADAS POR "\ n" SKIP 1 LINE ...; (Consulte la página del manual para más detalles).

Haga lo mismo para cada tabla csv ->.

Rick James
fuente