Erstellen Sie eine Tabelle aus einer CSV-Datei mit Überschriften

12

Ich suche nach einer Möglichkeit, eine neue MySQL-Tabelle zu generieren, die ausschließlich auf dem Inhalt einer bestimmten CSV basiert. Die CSV-Dateien, die ich verwenden werde, haben die folgenden Eigenschaften:

  • "|" abgegrenzt.
  • Die erste Zeile gibt die Spaltennamen (Überschriften) an, auch "|" abgegrenzt.
  • Spaltennamen und -reihenfolge sind nicht festgelegt.
  • Die Anzahl der Spalten ist nicht festgelegt.
  • Dateien sind groß (1 mil Zeilen / 50 Spalten).

In Excel ist das alles ziemlich einfach, aber mit MySQL scheint es nicht so zu sein (kein Glück mit Google). Irgendwelche Vorschläge, worauf ich achten sollte?

user58602
quelle

Antworten:

10

Sie können csvsql verwenden , das Teil von csvkit(einer Reihe von Dienstprogrammen zum Konvertieren in und Arbeiten mit CSV-Dateien) ist:

  • Linux oder Mac OS X.
  • kostenlos und Open Source
  • sudo pip install csvkit
  • Beispiel: csvsql --dialect mysql --snifflimit 100000 datatwithheaders.csv > mytabledef.sql
  • Es wird eine CREATE TABLEAnweisung basierend auf dem Dateiinhalt erstellt. Spaltennamen werden aus der ersten Zeile der CSV-Datei übernommen.
Franck Dernoncourt
quelle
2

Wenn Sie mit Python einverstanden sind, hat Pandas für mich hervorragend funktioniert (csvsql hing für immer und weniger Spalten und Zeilen als in Ihrem Fall). Etwas wie:

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
quelle
Wo definieren Sie dwh_engine? Ist das ein Tippfehler und du meintest engine?
Joanolo
Ja sollte es sein engine! Die Antwort wurde korrigiert, danke für das
Erkennen
to_sql nimmt zu viel Zeit in Anspruch, wenn die Anzahl der Zeilen hoch ist. Für uns dauerten rund 36000 Reihen rund 90 Minuten. Eine direkte Ladeanweisung wurde in 3 Sekunden durchgeführt.
Mvinayakam
0

Sie müssen eine CREATE TABLE basierend auf Datentypen, Größe usw. der verschiedenen Spalten generieren.

Dann verwenden Sie LOAD DATA INFILE ... FIELDS TERMINATED BY '|' LINIEN BEENDET DURCH "\ n" SKIP 1 LINE ...; (Einzelheiten finden Sie auf der Handbuchseite.)

Tun Sie dies ebenfalls für jede CSV -> Tabelle.

Rick James
quelle