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?

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.

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)

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 ->.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.