382 Stimmen

Wie kann ich eine CSV-Datei in eine MySQL-Tabelle importieren?

Ich habe eine unnormalisierte Ereignis-Tagebuch-CSV von einem Kunden, die ich versuche, in eine MySQL-Tabelle zu laden, so dass ich in ein vernünftiges Format umgestalten kann. Ich habe eine Tabelle namens "CSVImport" erstellt, die für jede Spalte der CSV-Datei ein Feld enthält. Die CSV-Datei enthält 99 Spalten, so dass dies an sich schon eine schwierige Aufgabe war:

CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);

Für die Tabelle gelten keine Einschränkungen, und alle Felder enthalten VARCHAR(256)-Werte, mit Ausnahme der Spalten, die Zählungen (dargestellt durch INT), Ja/Nein (dargestellt durch BIT), Preise (dargestellt durch DECIMAL) und Textauszüge (dargestellt durch TEXT) enthalten.

Ich habe versucht, Daten in die Datei zu laden:

LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
SELECT * FROM CSVImport;
| NULL             | NULL        | NULL           | NULL | NULL               | 
...

Der ganze Tisch ist gefüllt mit NULL .

Ich denke, das Problem liegt darin, dass die Textauszüge mehr als eine Zeile enthalten und MySQL die Datei so analysiert, als ob jede neue Zeile einer Datenbankzeile entsprechen würde. Ich kann die Datei ohne Probleme in OpenOffice laden.

Die Datei clientdata.csv enthält 2593 Zeilen und 570 Datensätze. Die erste Zeile enthält Spaltennamen. Ich glaube, sie ist durch Kommata getrennt, und der Text ist offensichtlich durch doppelte Anführungszeichen getrennt.

UPDATE :

Im Zweifelsfall lesen Sie das Handbuch: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

Ich habe einige Informationen zu den LOAD DATA Anweisung, die OpenOffice schlau genug war, um daraus zu schließen, und jetzt lädt es die richtige Anzahl von Datensätzen:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Aber es gibt immer noch eine ganze Reihe von NULL Datensätze, und keine der geladenen Daten scheint sich an der richtigen Stelle zu befinden.

21voto

Vitaliy Pak Punkte 303

Wenn Sie MySQL Workbench (derzeit Version 6.3) verwenden, können Sie dies wie folgt tun:

  1. Klicken Sie mit der rechten Maustaste auf "Tabellen";
  2. Wählen Sie den Assistenten für den Import von Tabellendaten;
  3. Wählen Sie Ihre csv-Datei aus und folgen Sie den Anweisungen (JSON kann auch verwendet werden); Das Gute daran ist, dass Sie eine neue Tabelle auf der Grundlage der zu importierenden csv-Datei erstellen oder Daten in eine bestehende Tabelle laden können

enter image description here

13voto

lafncow Punkte 405

Sie können dies beheben, indem Sie die Spalten in Ihrer LOAD DATA-Anweisung auflisten. Von der Handbuch :

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

...in Ihrem Fall müssen Sie also die 99 Spalten in der Reihenfolge auflisten, in der sie in der csv-Datei erscheinen.

8voto

Juan Punkte 463

Ich sehe etwas Seltsames. Sie verwenden für ESCAPING dasselbe Zeichen, das Sie für ENCLOSING verwenden. Der Motor weiß also nicht, was er tun soll, wenn er ein '"' findet, und ich denke, dass deshalb nichts an der richtigen Stelle zu sein scheint. Ich denke, wenn Sie die ESCAPING-Zeile entfernen, sollte es gut laufen. Wie:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Es sei denn, Sie analysieren (manuell, visuell, ... ) Ihre CSV und finden heraus, welches Zeichen für Escape verwendet wird. Manchmal ist es '\'. Aber wenn Sie es nicht haben, verwenden Sie es nicht.

8voto

David Punkte 513

Versuchen Sie dies, es hat bei mir funktioniert

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

IGNORE 1 ROWS hier ignoriert die erste Zeile, die die Feldnamen enthält. Beachten Sie, dass Sie für den Dateinamen den absoluten Pfad der Datei angeben müssen.

7voto

user1464271 Punkte 87

Die mysql-Befehlszeile ist anfällig für zu viele Probleme beim Import. Hier ist, wie Sie es tun:

  • Verwenden Sie Excel, um die Kopfzeilennamen so zu bearbeiten, dass sie keine Leerzeichen enthalten.
  • als .csv speichern
  • Verwenden Sie den kostenlosen Navicat Lite Sql Browser zum Importieren und automatischen Erstellen einer neuen Tabelle (geben Sie ihr einen Namen).
  • Öffnen Sie die neue Tabelle und fügen Sie eine primäre automatische Zahlenspalte für ID ein.
  • Ändern Sie den Typ der Spalten wie gewünscht.
  • fertig!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X