MYSQL importiert Daten aus CSV mit LOAD DATA INFILE

106

Ich importiere einige Daten von 20000 Zeilen aus einer CSV-Datei in MySQL.

Die Spalten in der CSV befinden sich in einer anderen Reihenfolge als die Spalten der MySQL-Tabelle. Wie ordne ich automatisch Spalten zu, die MySQL-Tabellenspalten entsprechen?

Wenn ich ausführe

LOAD DATA INFILE'abc.csv' INTO TABLE abc

Diese Abfrage fügt alle Daten zur ersten Spalte hinzu.

Bitte schlagen Sie eine automatische Syntax für den Import von Daten nach MySQL vor.

MANJEET
quelle
Es gibt ein ähnliches Thema in stackoverflow.com/questions/11077801/import-csv-to-mysql-table/…
marciomolusco
Es ist mir passiert, ich habe herausgefunden, dass die Textdatei mit Zeilen geschrieben wurde, die mit '\ r' abgeschlossen sind, und ich habe versucht, die Daten zu importieren, wobei erwartet wurde, dass die Zeilen mit '\ n' beendet werden
Tamer
2
Ich habe ein umfangreiches Tutorial zum Laden von CSV-Daten in MySQL zusammen mit einem Syntaxgenerator-Tool in Excel geschrieben . Es sollte für die Leser nützlich sein.
mysql_user

Antworten:

169

Mit dem Befehl LOAD DATA INFILE können Sie eine CSV- Datei in eine Tabelle importieren .

Überprüfen Sie diesen Link MySQL - LOAD DATA INFILE .

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

Für MySQL 8.0-Benutzer:

Mit dem LOCALSchlüsselwort hold Sicherheitsrisiken und ab MySQL 8.0 ist die LOCALFunktion Falsestandardmäßig eingestellt. Möglicherweise wird der Fehler angezeigt:

FEHLER 1148: Der verwendete Befehl ist in dieser MySQL-Version nicht zulässig

Sie können es überschreiben, indem Sie den Anweisungen in den Dokumenten folgen . Beachten Sie, dass ein solches Überschreiben nicht das Sicherheitsproblem löst, sondern lediglich eine Bestätigung, dass Sie sich bewusst sind und bereit sind, das Risiko einzugehen.

Saharsh Shah
quelle
1
Darf ich wissen, was IGNORE 1 LINESgenau hier passiert? Danke im Voraus.
Koushik Das
5
@KoushikDas Es wird die erste Zeile ignoriert, die Spaltennamen definiert
Saharsh Shah
28
Achtung: Die Klausel LINES TERMINATED BY '\ r \ n' funktioniert für Windows-Dateien, Linux-Dateien sollten jedoch nur '\ n' enthalten.
ChuckCottrill
1
Es ist wichtig, sich daran zu erinnern, Schrägstriche zu verwenden: stackoverflow.com/a/42878067/470749
Ryan
3
nur ein Hinweis, dass das (col1, col2, col3 ....) nicht erforderlich ist. Nützlich, wenn Sie eine Tabelle im laufenden Betrieb erstellen, bevor Sie diese zum Einfügen von Daten verwenden.
Kieran Quinn
51

Sie müssen wahrscheinlich das FIELDS TERMINATED BY ','oder was auch immer das Trennzeichen sein mag.

Für eine CSV-Datei sollte Ihre Anweisung folgendermaßen aussehen:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
ckim
quelle
1
LOAD DATA LOCAL INFILE ... Ohne LOCAL wurde der Zugriff verweigert.
Ketankk
49

Vor dem Importieren der Datei müssen Sie Folgendes vorbereiten:

  • Eine Datenbanktabelle, in die die Daten aus der Datei importiert werden.
  • Eine CSV-Datei mit Daten, die mit der Anzahl der Spalten der Tabelle und dem Datentyp in jeder Spalte übereinstimmen.
  • Das Konto, das eine Verbindung zum MySQL-Datenbankserver herstellt, verfügt über die Berechtigungen FILE und INSERT.

Angenommen, wir haben folgende Tabelle:

Geben Sie hier die Bildbeschreibung ein

TABELLE MIT FOLGENDER ABFRAGE ERSTELLEN:

CREATE TABLE IF NOT EXISTS `survey` (
  `projectId` bigint(20) NOT NULL,
  `surveyId` bigint(20) NOT NULL,
  `views` bigint(20) NOT NULL,
  `dateTime` datetime NOT NULL
);

Ihre CSV-Datei muss ordnungsgemäß formatiert sein, z. B. siehe das beigefügte Bild:

Geben Sie hier die Bildbeschreibung ein

Wenn alles in Ordnung ist. Bitte führen Sie die folgende Abfrage aus, um Daten aus der CSV-Datei zu laden:

HINWEIS: Bitte fügen Sie den absoluten Pfad Ihrer CSV-Datei hinzu

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Wenn alles getan hat. Sie haben Daten aus CSV erfolgreich in eine Tabelle exportiert

Sunny SM
quelle
Wie können wir überprüfen, ob die CSV-Datei für jede Spalte den richtigen Datentyp hat, da standardmäßig ein ungültiger Datentyp ignoriert wird?
Umar Abbas
2
Tut mir leid, dass ich so eine alte Antwort gestört habe. Es ist sehr überzeugend, aber wie kann ich ein Feld überspringen. Angenommen, meine Tabelle enthält die Projekt-ID, die Umfrage-ID und die Datumszeit. Wie kann ich das Feld "Ansichten" überspringen?
Dänische Ansari
@MD Danish Ansari, Entschuldigung, eine alte Frage zu beantworten, aber Sie können die Tabellenspalten angeben. Ich habe Folgendes getan, wobei ich das erste Feld (einen Primärschlüssel für die automatische Inkrementierung) sowie einige andere Felder überspringen muss: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'IN TABLE my_log_tbl FELDER BEENDET VON', 'EINGESCHLOSSEN VON' "'LINIEN BEENDET VON' \ r \ n '(Benutzer-ID, Kunden-ID, Institution-ID, Anwendungs-ID, FullURL, AccessTimeStamp, IP-Adresse); Ich hatte gedacht, die Spalten sollten nach dem kommen Tabellenname, aber das hat nicht funktioniert. Sie sollten am Ende erscheinen.
Kalinma
17

Syntax:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name' INTO TABLE `tbl_name`
CHARACTER SET [CHARACTER SET charset_name]
FIELDS [{FIELDS | COLUMNS}[TERMINATED BY 'string']] 
[LINES[TERMINATED BY 'string']] 
[IGNORE number {LINES | ROWS}]

Siehe dieses Beispiel:

LOAD DATA LOCAL INFILE
'E:\\wamp\\tmp\\customer.csv' INTO TABLE `customer`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
Md. Nashir Uddin
quelle
10

Fügen Sie mehr als 7000000 Datensätze in 1 Minute in die Datenbank ein (superschnelle Abfrage mit Berechnung)

mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ');
$affected = (int) (mysqli_affected_rows($cons))-1; 
$log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP und RRP_nl und RRP_bl sind nicht in csv, aber wir berechnen das und nach dem Einfügen das.

krunal panchal
quelle
2

Wenn Sie LOAD DATA LOCAL INFILEüber die Windows-Shell ausgeführt werden und diese verwenden müssen OPTIONALLY ENCLOSED BY '"', müssen Sie Folgendes tun, um Zeichen ordnungsgemäß zu umgehen:

"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql" -u root --password=%password% -e "LOAD DATA LOCAL INFILE '!file!' INTO TABLE !table! FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"^""' LINES TERMINATED BY '\n' IGNORE 1 LINES" --verbose --show-warnings > mysql_!fname!.out
Kikoz
quelle
2

Angenommen, Sie verwenden xampp und phpmyadmin

Sie haben den Dateinamen 'bewertungen.txt' Tabellenname 'Bewertungen' und den Datenbanknamen 'Filme'

wenn Ihre xampp in "C: \ xampp \" installiert ist

Kopieren Sie Ihre Datei "reviews.txt" in den Ordner "C: \ xampp \ mysql \ data \ movies"

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

Ich hoffe, dies kann Ihnen helfen, Ihren Fehler zu vermeiden, wenn Sie dies auf localhost tun

Mohammad Arshi
quelle
0

Sie können Daten aus einer CSV- oder Textdatei laden. Wenn Sie eine Textdatei mit Datensätzen aus einer Tabelle haben, können Sie diese Datensätze in die Tabelle laden. Wenn Sie beispielsweise eine Textdatei haben, in der jede Zeile ein Datensatz mit den Werten für jede Spalte ist, können Sie die Datensätze auf diese Weise laden.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

- Beispiel unter Windows

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 
Jorge T.
quelle
0

Ich habe den Fehlercode 1290 erhalten. Der MySQL-Server wird mit der Option --secure-file-priv ausgeführt, sodass diese Anweisung nicht ausgeführt werden kann

Dies funktionierte für mich unter Windows 8.1 64 Bit mit Wampserver 3.0.6 64bit.

Die Datei my.ini wurde unter C: \ wamp64 \ bin \ mysql \ mysql5.7.14 bearbeitet

Löschen Sie den Eintrag secure_file_priv c: \ wamp64 \ tmp \ (oder welches Verzeichnis auch immer Sie hier haben)

Habe alles gestoppt - Wamp usw. verlassen - und alles neu gestartet; Dann stecke meine CVS-Datei in C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (das letzte Verzeichnis ist mein Datenbankname).

LOAD DATA INFILE 'myfile.csv' ausgeführt

IN TABELLE Alumnos

FELDER BEENDET MIT ','

UMSCHLOSSEN '"'

LINIEN BEENDET MIT '\ r \ n'

Ignorieren Sie 1 Zeilen

... und VOILA !!!

Carlos Garcia
quelle
0

Sie können versuchen, Folgendes einzufügen:

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);
Hozayfa
quelle
0

In diesen Tagen (Ende 2019) bevorzuge ich die Verwendung eines Tools wie http://www.convertcsv.com/csv-to-sql.htm. Ich habe viele Zeilen, in denen Sie partitionierte Blöcke ausführen können, um Benutzerfehler zu vermeiden, wenn CSV von dort kommt eine Endbenutzer-Tabelle.

Jonathan Perrotta
quelle