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?

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.

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)

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.