web-dev-qa-db-fra.com

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

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

12
user58602

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 un CREATE TABLE instruction basée sur le contenu du fichier. Les noms de colonnes sont extraits de la première ligne du fichier CSV.
10
Franck Dernoncourt

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)
2
ivansabik

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

0
Rick James