Importieren Sie CSV in MySQL-Tabelle

Was ist der beste/schnellste Weg, um eine CSV-Datei in eine MySQL-Tabelle hochzuladen? Ich möchte für die erste Zeile der Daten als Spaltennamen verwendet werden.

Ich habe es gefunden:

So importieren Sie eine CSV-Datei in die MySQL-Tabelle

Aber die einzige Antwort war, eine GUI zu verwenden und nicht Shell?

93
hinzugefügt bearbeitet
Ansichten: 17
Die Antwort auf die Frage, zu der Sie verlinken, war eine GUI. Die Antwort, die Sie Referenzen sind, wurde gestern zur Verfügung gestellt, während diese Frage (Antwort) von 2012 ist.
hinzugefügt der Autor lcm, Quelle
Und selbst die GUI-Lösung übernimmt nicht die Spaltennamen aus dem CSV ... Sie müssen vor dem Import die gesamte Tabelle erstellen.
hinzugefügt der Autor Dominique, Quelle
Die Frage hat bereits eine Antwort hier stackoverflow.com/questions/3635166/…
hinzugefügt der Autor David, Quelle

12 Antworten

Anstatt ein Skript zum Abrufen von Informationen aus einer CSV-Datei zu schreiben, können Sie MYSQL direkt mit diesem verknüpfen und die Informationen mit der folgenden SQL-Syntax hochladen.

Um eine Excel-Datei in MySQL zu importieren, exportieren Sie sie zunächst als CSV-Datei. Entfernen Sie die CSV-Header aus der generierten CSV-Datei zusammen mit leeren Daten, die Excel möglicherweise am Ende der CSV-Datei abgelegt hat.

Sie können es dann in eine MySQL-Tabelle importieren, indem Sie Folgendes ausführen:

load data local infile 'uniq.csv' into table tblUniq fields terminated by ','
  enclosed by '"'
  lines terminated by '\n'
    (uniqName, uniqCity, uniqComments)

as read on: Import CSV file directly into MySQL

BEARBEITEN

Für Ihren Fall müssen Sie zuerst einen Interpreter schreiben, um die erste Zeile zu finden und sie als Spaltennamen zuzuordnen.


BEARBEITEN-2

Aus den MySQL-Dokumenten zur LOAD DATA -Syntax :

Die Option IGNORE number LINES kann zum Ignorieren von Zeilen im   Start der Datei. Zum Beispiel können Sie IGNORE 1 LINES zum Überspringen verwenden   über eine erste Kopfzeile mit Spaltennamen:

 LOAD DATA INFILE '/tmp/test.txt' INTO TABLE-Test IGNORE 1 LINES;
 

Daher können Sie die folgende Anweisung verwenden:

LOAD DATA LOCAL INFILE 'uniq.csv'
INTO TABLE tblUniq
FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(uniqName, uniqCity, uniqComments)
144
hinzugefügt
Danke ... das wird jetzt gut funktionieren.
hinzugefügt der Autor lcm, Quelle
Anstatt die erste Zeile zu entfernen, können Sie der Abfrage IGNORE 1 LINES hinzufügen
hinzugefügt der Autor mb14, Quelle
Wie debugge ich diesen Befehl, wenn er fehlschlägt? Ich versuche, eine Datei mit diesem Befehl zu laden, aber es tut nichts.
hinzugefügt der Autor YumYumYum, Quelle
Weißt du, ob es eine Möglichkeit gibt, den Dateipfad auf die CSV-Datei zu setzen?
hinzugefügt der Autor JasonDavis, Quelle
@rahul welchen Fehler bekommst du? Verwenden Sie LOAD DATA LOCAL INFILE ? oder einfach LOAD DATA INFILE ?
hinzugefügt der Autor hjpotter92, Quelle
Wie wäre es, wenn ich eine Spalte in CSV ignorieren möchte?
hinzugefügt der Autor Marci-man, Quelle
Danke, arbeite für mich
hinzugefügt der Autor Yuday, Quelle
Wie erteile ich die Erlaubnis für meine lokale csv-Datei, auf die der mysql-Server zugreifen soll, der auf aws (rds) läuft
hinzugefügt der Autor rahul, Quelle
Danke LOAD DATA LOCAL INFILE hat funktioniert
hinzugefügt der Autor rahul, Quelle

Hier ist ein einfaches PHP-Befehlszeilenskript, das genau das tut, was Sie brauchen:

<?php

$host = 'localhost';
$user = 'root';
$pass = '';
$database = 'database';

$db = mysql_connect($host, $user, $pass);
mysql_query("use $database", $db);

/********************************************************************************/
// Parameters: filename.csv table_name

$argv = $_SERVER[argv];

if($argv[1]) { $file = $argv[1]; }
else {
    echo "Please provide a file name\n"; exit; 
}
if($argv[2]) { $table = $argv[2]; }
else {
    $table = pathinfo($file);
    $table = $table['filename'];
}

/********************************************************************************/
// Get the first row to create the column headings

$fp = fopen($file, 'r');
$frow = fgetcsv($fp);

foreach($frow as $column) {
    if($columns) $columns .= ', ';
    $columns .= "`$column` varchar(250)";
}

$create = "create table if not exists $table ($columns);";
mysql_query($create, $db);

/********************************************************************************/
// Import the data into the newly created table.

$file = $_SERVER['PWD'].'/'.$file;
$q = "load data infile '$file' into table $table fields terminated by ',' ignore 1 lines";
mysql_query($q, $db);

?>

Es wird eine Tabelle basierend auf der ersten Zeile erstellt und die verbleibenden Zeilen werden importiert. Hier ist die Befehlszeilensyntax:

php csv_import.php csv_file.csv table_name
23
hinzugefügt
Es funktioniert NIEMALS. Repariere es im Site Code.
hinzugefügt der Autor YumYumYum, Quelle
Diese Antwort ist viel besser als die angenommene Antwort. Insbesondere erlaubt es, was das OP verlangt, und ich möchte auch: "die erste Zeile der Daten als Spaltennamen verwendet werden". (Ich würde ein Skript in Python bevorzugen, also muss ich PHP nicht installieren, aber es sollte nicht schwierig sein, es zu portieren.)
hinzugefügt der Autor LarsH, Quelle
Dies ist eine Link-Antwort. Setzen Sie den relevanten Code in den Post selbst, andernfalls ist die Antwort nutzlos, wenn die Verbindung abstirbt.
hinzugefügt der Autor gre_gor, Quelle
@gre_gor Ich habe den Code hinzugefügt.
hinzugefügt der Autor Hawkee, Quelle
@YumYumYum Kannst du näher auf das Problem eingehen, das du hast?
hinzugefügt der Autor Hawkee, Quelle
Ich glaube, du meinst ENCLOSED BY '\ "' ... auch viele Leute werden LINES TERMINATED BY '\ r \ n' benötigen, wenn sie eine CSV von Windows verwenden. Und schließlich ist es sinnvoll, die Feldnamen mit Backticks zu umgehen, falls Leerzeichen vorhanden sind: $ columns. = "$ Spalte` varchar (250) ";
hinzugefügt der Autor dlo, Quelle
Kann ich dir ein Bier kaufen?
hinzugefügt der Autor Joe, Quelle
Awesome Skript. Für diejenigen mit doppelt zitierten CSV-Dateien (lesen Sie die meisten Leute) fügen Sie `ENCASED IN '\' '` zu Felder mit', ' ... gerade abgeschlossen arbeitet mit teilweise doppelt zitierten CSVs.
hinzugefügt der Autor Joel Mellon, Quelle

Erstellen Sie zuerst eine Tabelle in der Datenbank mit derselben Anzahl von Spalten, die sich in der CSV-Datei befinden.

Dann benutze die folgende Abfrage

LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
4
hinzugefügt
@ Marci-Man versuchen diese stackoverflow.com/q/2139069
hinzugefügt der Autor Muk, Quelle
Wie wäre es, wenn ich eine Spalte in CSV ignorieren möchte?
hinzugefügt der Autor Marci-man, Quelle

Wenn Sie phpadmin installieren können, gibt es einen Import-Abschnitt, wo Sie CSV-Dateien in Ihre Datenbank importieren können. Es gibt sogar ein Kontrollkästchen, um den Header auf die erste Zeile der Datei zu setzen, die die Tabellenspaltennamen enthält (wenn dies nicht markiert ist) Die erste Zeile wird Teil der Daten

4
hinzugefügt
Ich bin wirklich überrascht, dass Sie ein Add-on wie phpadmin verwenden müssen, um diese Funktionalität zu erhalten, Danke für Ihre Antwort
hinzugefügt der Autor chrisfs, Quelle
Das hat gerade meinen Tag gemacht
hinzugefügt der Autor Mark, Quelle

Um Daten aus einer Textdatei oder CSV-Datei zu laden, ist der Befehl

load data local infile 'file-name.csv'
into table table-name
fields terminated by '' enclosed by '' lines terminated by '\n' (column-name);

Im obigen Befehl, in meinem Fall, gibt es nur eine Spalte, die geladen werden soll, also gibt es kein "terminiert von" und "eingeschlossen von", so dass ich es leer halte, sonst kann der Programmierer das Trennzeichen eingeben. für z.B. , (Komma) oder "oder; oder irgendeine Sache.

** für Leute, die MySQL Version 5 und höher benutzen **

Before loading the file into MySQL must ensure that below tow line are added in side etc/mysql/my.cnf

zu bearbeiten my.cnf -Befehl ist

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  
3
hinzugefügt

Wenn Sie MySQL als "mysql -u -p --local-infile" starten, wird es funktionieren

3
hinzugefügt

Ich habe einige Zeit damit gerungen. Das Problem liegt nicht darin, wie die Daten geladen werden, sondern wie die Tabelle aufgebaut wird, um sie zu speichern. Sie müssen eine DDL-Anweisung generieren, um die Tabelle vor dem Importieren der Daten zu erstellen.

Besonders schwierig, wenn der Tisch eine große Anzahl von Spalten hat.

Hier ist ein Python-Skript, das (fast) die Aufgabe erfüllt:

#!/usr/bin/python    
import sys
import csv

# get file name (and hence table name) from command line
# exit with usage if no suitable argument   
if len(sys.argv) < 2:
   sys.exit('Usage: ' + sys.argv[0] + ': input CSV filename')
ifile = sys.argv[1]

# emit the standard invocation
print 'create table ' + ifile + ' ('

with open(ifile + '.csv') as inputfile:
   reader = csv.DictReader(inputfile)
   for row in reader:
      k = row.keys()
      for item in k:
         print '`' + item + '` TEXT,'
      break
   print ')\n'

Das zu lösende Problem besteht darin, dass die abschließende Feldname- und Datentypdeklaration mit einem Komma abgeschlossen wird und der mySQL-Parser dies nicht toleriert.

Natürlich hat es auch das Problem, dass es den TEXT-Datentyp für jedes Feld verwendet. Wenn die Tabelle mehrere hundert Spalten enthält, wird VARCHAR (64) die Tabelle zu groß machen.

Dies scheint auch bei der maximalen Anzahl von Spalten für mySQL zu brechen. Dann ist es an der Zeit, zu Hive oder HBase zu wechseln, wenn es Ihnen möglich ist.

2
hinzugefügt

Ich habe Google-Suche viele Möglichkeiten, um CSV zu MySQL zu importieren, "laden Daten infile", verwenden Sie MySQL Workbench, etc.

Wenn ich die MySQL Workbench-Import-Schaltfläche verwende, müssen Sie zuerst die leere Tabelle selbst erstellen und jeden Spaltentyp selbst festlegen. Hinweis: Sie müssen ID-Spalte am Ende als Primärschlüssel und nicht Null und Auto_increment hinzufügen, sonst wird die Import-Schaltfläche später nicht sichtbar. Allerdings, wenn ich CSV-Datei starten, nichts geladen, scheint wie ein Fehler. Ich gebe auf.

Lucky, the best easy way so far I found is to use Oracle's MySQL for excel. you can download it from here mysql for excel

Das werden Sie tun: Öffnen Sie die CSV-Datei in Excel, auf der Registerkarte Daten finden Sie Mysql für Excel-Taste

Wählen Sie alle Daten aus und klicken Sie auf "Exportieren" in "mysql". Hinweis: Legen Sie eine ID-Spalte als Primärschlüssel fest.

Wenn Sie fertig sind, gehen Sie zu MySQL workbench, um die Tabelle zu ändern, Wie Währungstyp sollte Dezimal (19,4) für große Menge Dezimal (10,2) für die regelmäßige Verwendung sein. anderer Feldtyp kann auf varchar (255) festgelegt werden.

2
hinzugefügt

Ich habe einen Code geschrieben, um das zu tun, ich werde ein paar Schnipsel einfügen:

$dir = getcwd();//Get current working directory where this .php script lives
$fileList = scandir($dir);//scan the directory where this .php lives and make array of file names

Dann holen Sie sich die CSV-Header, damit Sie MySQL sagen können, wie Sie importieren (beachten Sie: Stellen Sie sicher, dass Ihre mysql-Spalten genau mit den csv-Spalten übereinstimmen):

//extract headers from .csv for use in import command
$headers = str_replace("\"", "`", array_shift(file($path)));
$headers = str_replace("\n", "", $headers);

Dann senden Sie Ihre Anfrage an den MySQL-Server:

mysqli_query($cons, '
        LOAD DATA LOCAL INFILE "'.$path.'"
            INTO TABLE '.$dbTable.'  
            FIELDS TERMINATED by \',\' ENCLOSED BY \'"\'
            LINES TERMINATED BY \'\n\'
            IGNORE 1 LINES
            ('.$headers.')
            ;
        ')or die(mysql_error());
2
hinzugefügt

Hier ist, wie ich es in Python mit csv und dem MySQL-Konnektor :

import csv
import mysql.connector

credentials = dict(user='...', password='...', database='...', host='...')
connection = mysql.connector.connect(**credentials)
cursor = connection.cursor(prepared=True)
stream = open('filename.csv', 'rb')
csv_file = csv.DictReader(stream, skipinitialspace=True)

query = 'CREATE TABLE t ('
query += ','.join('`{}` VARCHAR(255)'.format(column) for column in csv_file.fieldnames)
query += ')'
cursor.execute(query)
for row in csv_file:
    query = 'INSERT INTO t SET '
    query += ','.join('`{}` = ?'.format(column) for column in row.keys())
    cursor.execute(query, row.values())

stream.close()
cursor.close()
connection.close()

Schlüsselpunkte

  • Use prepared statements for the INSERT
  • Open the file.csv in 'rb' binary
  • Some CSV files may need tweaking, such as the skipinitialspace option.
  • If 255 isn't wide enough you'll get errors on INSERT and have to start over.
  • Adjust column types, e.g. ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • Add a primary key, e.g. ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;
1
hinzugefügt

Importieren Sie CSV-Dateien in die MySQL-Tabelle

LOAD DATA LOCAL INFILE 'd:\\Site.csv' INTO TABLE `siteurl` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

Character   Escape Sequence
\0      An ASCII NUL (0x00) character
\b      A backspace character
\n      A newline (linefeed) character
\r      A carriage return character
\t      A tab character.
\Z      ASCII 26 (Control+Z)
\N      NULL

visits : http://www.webslessons.com/2014/02/import-csv-files-using-php-and-mysql.html

0
hinzugefügt

Wie andere bereits erwähnt haben, funktionieren die lokalen Daten der Ladedaten problemlos. Ich habe das PHP-Skript ausprobiert, das Hawkee gepostet hat, aber nicht für mich gearbeitet hat. Anstatt es zu debuggen, habe ich Folgendes getan:

1) kopiere die Kopfzeile der CSV-Datei in eine TXT-Datei und bearbeite sie mit Emacs. fügen Sie ein Komma und ein CR zwischen jedem Feld hinzu, um jedes in seiner eigenen Zeile zu erhalten.
2) Speichern Sie diese Datei als FieldList.txt
3) Bearbeiten Sie die Datei, um für jedes Feld defns zu enthalten (die meisten waren varchar, aber einige waren int (x). Fügen Sie create table tabelname hinzu (bis zum Anfang der Datei und) bis zum Ende von die Datei speichern Sie sie als CreateTable.sql
4) Starten Sie den MySQL-Client mit der Eingabe der Createtable.sql-Datei, um die Tabelle zu erstellen 5) starte MySQL client, kopiere/füge den größten Teil des "LOAD DATA INFILE" -Befehls ein und ersetze meinen Tabellennamen und den csv-Dateinamen. Fügen Sie in der FieldList.txt-Datei ein. Stellen Sie sicher, dass Sie die 'IGNORE 1 LINES' vor dem Einfügen in die Feldliste einfügen

Klingt nach viel Arbeit, aber einfach mit Emacs .....

0
hinzugefügt