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

229voto

michalzuber Punkte 4791

Utilice mysqlimport um eine Tabelle in die Datenbank zu laden:

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv

Ich habe es gefunden bei http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

Um das Trennzeichen zu einem Tabulator zu machen, verwenden Sie --fields-terminated-by='\t'

150voto

Pekka Punkte 429407

Der Kern Ihres Problems scheint darin zu bestehen, die Spalten in der CSV-Datei mit denen in der Tabelle abzugleichen.

Viele grafische mySQL-Clients haben sehr schöne Importdialoge für diese Art von Dingen.

Mein Favorit für diese Aufgabe ist Windows-basiert HeidiSQL . Es bietet Ihnen eine grafische Schnittstelle zur Erstellung der LOAD DATA Befehl; Sie können ihn später programmatisch wiederverwenden.

Import textfile

Screenshot: "Dialog "Textdatei importieren

Um den Dialog Textdatei importieren" zu öffnen, gehen Sie zu Tools > Import CSV file :

enter image description here

96voto

DareDevil Punkte 5150

Die einfachste Methode, mit der ich 200+ Zeilen importiert habe, ist der folgende Befehl im phpmyadmin-SQL-Fenster

Ich habe eine einfache Ländertabelle mit zwei Spalten CountryId,CountryName

hier sind die .csv-Daten CSV FILE

hier ist der Befehl:

LOAD DATA INFILE 'c:/country.csv' 
INTO TABLE country 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

Denken Sie daran, dass in der zweiten Spalte niemals , erscheinen darf, sonst wird der Import gestoppt.

90voto

Fahad Punkte 1843

Ich habe diese Methode verwendet, um mehr als 100K Datensätze zu importieren ( ~5MB ) in 0.046sec

Und so geht's:

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Es ist sehr wichtig, die letzte Zeile einzuschließen, wenn Sie mehr als ein Feld haben, d.h. normalerweise wird das letzte Feld übersprungen (MySQL 5.6.17)

LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Angenommen, Sie haben die erste Zeile als Titel für Ihre Felder, sollten Sie auch diese Zeile einfügen

IGNORE 1 ROWS

So sieht es aus, wenn Ihre Datei eine Kopfzeile hat.

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);

35voto

Farhan Punkte 1521

phpMyAdmin kann CSV-Import verarbeiten. Hier sind die Schritte:

  1. Bereiten Sie die CSV-Datei so vor, dass die Felder in der gleichen Reihenfolge angeordnet sind wie die Felder der MySQL-Tabelle.

  2. Entfernen Sie die Kopfzeile aus der CSV-Datei (falls vorhanden), so dass nur die Daten in der Datei enthalten sind.

  3. Rufen Sie die phpMyAdmin-Oberfläche auf.

  4. Wählen Sie die Tabelle im linken Menü aus.

  5. Klicken Sie auf die Schaltfläche "Importieren" am oberen Rand.

  6. Suchen Sie nach der CSV-Datei.

  7. Wählen Sie die Option "CSV mit LOAD DATA".

  8. Geben Sie "," in die "Felder abgeschlossen durch" ein.

  9. Geben Sie die Spaltennamen in der gleichen Reihenfolge ein, wie sie in der Datenbanktabelle stehen.

  10. Klicken Sie auf die Schaltfläche "Go" und Sie sind fertig.

Dies ist eine Notiz, die ich für meinen zukünftigen Gebrauch vorbereitet habe, und die ich hier weitergeben möchte, falls jemand anderes davon profitieren kann.

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