Créer une table à partir d'un fichier CSV avec des en-têtes

12

Je cherche un moyen de générer une nouvelle table MySQL uniquement sur la base du contenu d'un CSV spécifié. Les fichiers CSV que j'utiliserai ont les propriétés suivantes;

  • "|" délimité.
  • La première ligne spécifie les noms des colonnes (en-têtes), également "|" délimité.
  • Les noms et l'ordre des colonnes ne sont pas fixes.
  • Le nombre de colonnes n'est pas fixe.
  • Les fichiers sont de grande taille (1 mil lignes / 50 colonnes).

Dans Excel, tout cela est assez simple, mais avec MySQL, cela ne semble pas l'être (pas de chance avec Google). Des suggestions sur ce que je devrais regarder?

user58602
la source

Réponses:

10

Vous pouvez utiliser csvsql , qui fait partie de csvkit(une suite d'utilitaires pour convertir et travailler avec des fichiers CSV):

  • Linux ou Mac OS X
  • gratuit et open source
  • sudo pip install csvkit
  • Exemple: csvsql --dialect mysql --snifflimit 100000 datatwithheaders.csv > mytabledef.sql
  • Il crée une CREATE TABLEdéclaration basée sur le contenu du fichier. Les noms de colonnes sont extraits de la première ligne du fichier CSV.
Franck Dernoncourt
la source
2

Si vous êtes d'accord avec l'utilisation de Python, Pandas a très bien fonctionné pour moi (csvsql a été suspendu pour toujours et moins de colonnes et de lignes que dans votre cas). Quelque chose comme:

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
la source
Où définissez-vous dwh_engine? Est-ce une faute de frappe et tu voulais dire engine?
joanolo
Oui, ça devrait l'être engine! Correction de la réponse merci pour le repérage
ivansabik
to_sql prend trop de temps si le nombre de lignes est élevé. Pour nous, environ 36 000 lignes ont pris environ 90 minutes. Une instruction de chargement direct a été effectuée en 3 secondes.
mvinayakam
0

Vous devez générer une CREATE TABLE basée sur les types de données, la taille, etc. des différentes colonnes.

Ensuite, vous utilisez LOAD DATA INFILE ... FIELDS TERMINATED BY '|' LIGNES TERMINÉES PAR "\ n" SKIP 1 LINE ...; (Voir la page de manuel pour plus de détails.)

Faites de même pour chaque table csv ->.

Rick James
la source