Comment importer un fichier CSV dans une table MySQL?

306

J'ai un journal d'événements CSV non normalisé d'un client que j'essaie de charger dans une table MySQL afin de pouvoir le refactoriser dans un format sain. J'ai créé une table appelée «CSVImport» qui a un champ pour chaque colonne du fichier CSV. Le CSV contient 99 colonnes, donc c'était une tâche assez difficile en soi:

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);

Aucune contrainte n'est sur la table, et tous les champs contiennent des valeurs VARCHAR (256), à l'exception des colonnes qui contiennent les nombres (représentés par INT), oui / non (représentés par BIT), les prix (représentés par DECIMAL) et les textes textuels ( représenté par TEXT).

J'ai essayé de charger des données dans le fichier:

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

La table entière est remplie de NULL.

Je pense que le problème est que les textes de texte contiennent plus d'une ligne, et MySQL analyse le fichier comme si chaque nouvelle ligne correspondait à une ligne de base de données. Je peux charger le fichier dans OpenOffice sans problème.

Le fichier clientdata.csv contient 2593 lignes et 570 enregistrements. La première ligne contient les noms des colonnes. Je pense qu'il est délimité par des virgules, et le texte est apparemment délimité par des guillemets doubles.

METTRE À JOUR:

En cas de doute, lisez le manuel: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

J'ai ajouté quelques informations à la LOAD DATAdéclaration selon laquelle OpenOffice était suffisamment intelligent pour en déduire, et maintenant il charge le nombre correct d'enregistrements:

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;

Mais il y a encore beaucoup d' NULLenregistrements complets , et aucune des données chargées ne semble être au bon endroit.

Iain Samuel McLean Elder
la source
17
Et si vous êtes sur OSX Sequel Pro a un outil d'importation génial et c'est GRATUIT ;-)
Merrick
41
C'est incroyable pour moi que l'affiche originale ait mieux répondu à sa propre question que quiconque ... Je ne sais pas pourquoi tant de gens sont si prêts à donner des recommandations logicielles quand il existe une commande SQL existante, qui peut être programmatique plutôt que l'interface utilisateur -basé. Je ne connais personne d'autre, mais la programmation signifie pour moi que je peux configurer des scripts pour importer automatiquement des fichiers sur des horodatages, alors que l'interface utilisateur est purement manuelle.
Chris Cirefice
@ChrisCirefice: Je pense que la réponse acceptée l'explique bien. Il avait besoin d'aide pour créer manuellement la commande «charger les données», avec laquelle un programme graphique peut aider. Une fois que le programme graphique avait créé la commande «charger les données», il pouvait ensuite la réutiliser par programme.
AlexC
@Merrick cela a fonctionné sur osx
weaveoftheride
J'ai écrit un tutoriel complet pour charger des données csv dans mysql avec un outil générateur de syntaxe dans Excel .
mysql_user

Réponses:

133

Le cœur de votre problème semble correspondre aux colonnes du fichier CSV à celles du tableau.

De nombreux clients graphiques mySQL ont de très belles boîtes de dialogue d'importation pour ce genre de choses.

Mon préféré pour le travail est HeidiSQL basé sur Windows . Il vous donne une interface graphique pour construire la LOAD DATAcommande; vous pouvez le réutiliser par programme plus tard.

Importer un fichier texte

Capture d'écran: Boîte de dialogue "Importer un fichier texte"

Pour ouvrir la boîte de dialogue Importer un fichier texte ", accédez à Tools > Import CSV file:

entrez la description de l'image ici

Pekka
la source
25
Pour Mac OSX, utilisez Sequel Pro.
Agi Hammerthief
3
Je viens de l'essayer et il me faut d'abord créer la table ... au lieu d'utiliser les noms de colonne.
Dominique
3
Vous devez sélectionner une table avant de pouvoir continuer ... et puisque tout le point n'est pas d'avoir à faire la table ...
Dominique
3
Notez que sous Linux, HeidiSQL fonctionne très bien sous Wine.
AlejandroVD
1
Le très @ Paul le point de la réponse est que les outils de l' interface graphique peuvent faire des colonnes d'importation correspondant aux colonnes de table plus facile.
Pekka
191

Utilisez mysqlimport pour charger une table dans la base de données:

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

Je l'ai trouvé sur http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

Pour faire du délimiteur un onglet, utilisez --fields-terminated-by='\t'

michalzuber
la source
6
mysqlimportutilise LOAD DATA INFILE...dans les coulisses, donc c'est à peu près la même chose.
Mladen Jablanović
8
Comme pour LOAD DATA INFILE, vous devez créer une table avant de pouvoir l'utiliser mysqlimport.
Marcus Downing
@ MladenJablanović, ce n'est certainement pas la même chose. Essayez d'importer des lignes 1bil. Vous serez surpris de la différence énorme que cela fait en termes de performances
ninjabber
@ninjabber Les documents indiquent que le client mysqlimport fournit une interface de ligne de commande pour LOAD DATA INFILE , il est donc théoriquement impossible d'offrir un quelconque avantage en termes de performances LOAD DATA INFILE.
Mladen Jablanović
1
également besoin --fields-optionally-enclosed-by=\"et `--fields-escaped-by = \`
chaintng
80

La manière la plus simple dont j'ai importé plus de 200 lignes est la commande ci-dessous dans la fenêtre sql de phpmyadmin

J'ai une simple table de pays avec deux colonnes CountryId, CountryName

voici les données .csvFICHIER CSV

voici la commande:

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

Gardez une chose à l'esprit, n'apparaissez jamais dans la deuxième colonne, sinon votre importation s'arrêtera

DareDevil
la source
1
',' -> '\ t', '"' -> '' dans le cas de fichiers TSV et supprimez la dernière ligne si aucun en-tête (espérons que les robots de recherche l'indexeront).
Bleeding Fingers
16
S'il s'agit d'un fichier local, vous devrez peut-être le faire LOAD DATA LOCAL INFILE. Si cela génère une erreur 1148 "la commande utilisée n'est pas autorisée", vous pouvez l'activer en exécutant mysql sur la ligne de commande avec --local-infile.
Big McLargeHuge
j'ai eu l'erreur: ERREUR 1045 (28000): Accès refusé pour l'utilisateur 'utilisateur' @ '%' (en utilisant le mot de passe: OUI)
ARUNBALAN NV
Vous devez accorder tous les accès à l'utilisateur, depuis le panneau d'administration puis essayez d'importer le script.
DareDevil
1
Je reçois cette erreur: le serveur MySQL fonctionne avec l'option --secure-file-priv, il ne peut donc pas exécuter cette instruction
Agniswar Bakshi
66

Je sais que la question est ancienne , mais je voudrais partager cette

J'ai utilisé cette méthode pour importer plus de 100 Ko d' enregistrements ( ~ 5 Mo ) en 0,046 s

Voici comment procéder:

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);

Il est très important d'inclure la dernière ligne, si vous avez plus d'un champ c'est-à-dire que normalement il saute le dernier champ (MySQL 5.6.17)

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

Ensuite, en supposant que vous avez la première ligne comme titre pour vos champs, vous souhaiterez peut-être également inclure cette ligne

IGNORE 1 ROWS

Voici à quoi cela ressemble si votre fichier a une ligne d'en-tête.

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);
Fahad
la source
J'ai importé 16k lignes et 48 colonnes. Merci mon pote.
Renjith VR
C'est la meilleure solution. Pour tous ceux qui sont curieux de savoir à quel point cela est rapide: j'ai importé 3,2 millions de lignes en moins de 14 secondes sur une instance AWS Lightsail à 20 $ / mois, avec le serveur MySQL intégré (pas un RDS haute performance). Impressionnant!
master_gracey
Dans cette ligne, (field_1,field_2 , field_3);fait-il référence à la liste des colonnes dans un fichier .csv ou dans une table? c'est-à-dire, quels sont ces domaines?
tera_789
@ tera_789 Ceux de votre fichier csv qui correspondront probablement à votre table
Fahad
Doit suivre le format des données. exemple (pour mon cas) <pre> first_name, last_name, dob, phone_number, email, name, lastName, 12-05-2018,54545, faiz @ gmail.com, name1, lastName1,2018-05-12,456, faiz1 @ gmail .com, name2, lastName2,2018-05-12,456, faiz2 @ gmail.com, name3, lastName3,2018-05-22,456, faiz3 @ gmail.com, name4, lastName4,1988-05-22,456, faiz4 @ gmail.com , name5, lastName5,1988-05-22,456, faiz5 @ gmail.com, name6, lastName6,1987-05-21,456, faiz6 @ gmail.com </pre>
Faiz Ahmed
32

phpMyAdmin peut gérer l'importation CSV. Voici les étapes:

  1. Préparez le fichier CSV pour que les champs soient dans le même ordre que les champs de la table MySQL.

  2. Supprimez la ligne d'en-tête du CSV (le cas échéant), de sorte que seules les données se trouvent dans le fichier.

  3. Accédez à l'interface phpMyAdmin.

  4. Sélectionnez le tableau dans le menu de gauche.

  5. Cliquez sur le bouton d'importation en haut.

  6. Accédez au fichier CSV.

  7. Sélectionnez l'option "CSV utilisant LOAD DATA".

  8. Entrez "," dans les "champs terminés par".

  9. Entrez les noms de colonne dans le même ordre que dans la table de base de données.

  10. Cliquez sur le bouton OK et vous avez terminé.

Ceci est une note que j'ai préparée pour mon utilisation future et que je partage ici si quelqu'un d'autre peut en bénéficier.

Farhan
la source
C'est bon et simple. Je préfère créer des tables et des colonnes via SQL (donc je saute l'étape # 9) et insérer des données via l'importation CSV. N'oubliez pas de définir NULLdans le CSV pour tous les champs / colonnes à incrémentation automatique.
argent
Notez que phpMyAdmin échoue lamentablement lorsque des caractères cyrilliques sont inclus dans le fichier CSV, peu importe que vous lui disiez d'utiliser utf-8.
Fran Marzoa
N'oubliez pas de modifier la taille d'importation si vous importez un gros fichier CSV. BTW ce n'est pas une bonne option pour les gros fichiers CSV.
Avi
Cela nécessite tout d'abord de télécharger le fichier .csv sur un client Web car vous ne pouvez pas accéder à un fichier csv local.
mckenzm
Oui, vous devez cocher la case «Mot-clé local» et vous pouvez utiliser un fichier csv local
chrisfs
12

Vous pouvez résoudre ce problème en répertoriant les colonnes de votre instruction LOAD DATA. Du manuel :

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

... dans votre cas, vous devez répertorier les 99 colonnes dans l'ordre dans lequel elles apparaissent dans le fichier csv.

lafncow
la source
8

Essayez ça, ça a marché pour moi

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

IGNORE 1 ROWS ignore ici la première ligne qui contient les noms de champs. Notez que pour le nom de fichier, vous devez taper le chemin absolu du fichier.

David
la source
C'est la meilleure réponse. Pourquoi utiliser un autre outil quand une seule commande SQL fera l'affaire?
sdgfsdh
Savez-vous comment faire fonctionner cela lorsque vous essayez de charger le fichier dans mysql fonctionnant sur un serveur? Il me demande un accès refusé au fichier (mot de passe). Où entrer le mot de passe de l'emplacement du fichier csv?
Baktaawar
7

La ligne de commande mysql est sujette à trop de problèmes lors de l'importation. Voici comment procéder:

  • utilisez excel pour modifier les noms d'en-tête pour qu'ils n'aient pas d'espaces
  • enregistrer sous .csv
  • utiliser le navigateur gratuit Navicat Lite Sql pour importer et créer automatiquement une nouvelle table (donnez-lui un nom)
  • ouvrir la nouvelle table insérer une colonne de numéro automatique principale pour l'ID
  • changez le type des colonnes comme vous le souhaitez.
  • terminé!
user1464271
la source
5

Si vous utilisez MySQL Workbench (actuellement la version 6.3), vous pouvez le faire en:

  1. Faites un clic droit sur "Tables";
  2. Assistant d'importation de données de table;
  3. Choisissez votre fichier csv et suivez les instructions (JSON pourrait également être utilisé); La bonne chose est que vous pouvez créer une nouvelle table en fonction du fichier csv que vous souhaitez importer ou charger des données dans une table existante

entrez la description de l'image ici

Vitaliy Pak
la source
+1. Je l'ai utilisé parce que mysql ne cessait de me donner des erreurs pour LOAD DATA INFILEet mysqlimport("ceci n'est pas pris en charge sur cette version de mysql")
clmno
Cette méthode fonctionne, mais elle est plutôt lente. J'aurais pensé que l'utilisation de cette fonctionnalité aurait généré une INSERTrequête massive et essayé de tout faire en même temps, mais il semble que le faire de cette façon s'exécute en fait une fois INSERTpar ligne.
DaveTheMinion
4

Je vois quelque chose d'étrange. Vous utilisez pour ESCAPING le même caractère que vous utilisez pour ENCLOSING. Donc, le moteur ne sait pas quoi faire quand il trouve un '"' et je pense que c'est pourquoi rien ne semble être au bon endroit. Je pense que si vous supprimez la ligne de ESCAPING, devrait fonctionner très bien. Comme:

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

À moins d'analyser (manuellement, visuellement, ...) votre CSV et de trouver quel personnage utilise pour s'échapper. Est parfois «\». Mais si vous ne l'avez pas, ne l'utilisez pas.

Juan
la source
3

Encore une autre solution consiste à utiliser l' outil csvsql de l'incroyable suite csvkit .

Exemple d'utilisation:

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

Cet outil peut automatiquement déduire les types de données (comportement par défaut), créer une table et insérer les données dans la table créée. --overwriteL'option peut être utilisée pour supprimer la table si elle existe déjà. --insertoption - pour remplir le tableau à partir du fichier.

Pour installer la suite

pip install csvkit

Pré - requis: python-dev , libmysqlclient-dev,MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python
ruvim
la source
3

Comment importer des fichiers CSV dans des tables SQL

Fichier d'exemple: fichier Overseas_trade_indexCSV de données

Pas:

  1. Besoin de créer une table pour overseas_trade_index.

  2. Besoin de créer des colonnes liées au fichier csv.

    Requête SQL:

    ( id int not null primary key auto_increment,
    series_reference varchar (60),
    period varchar (60),
    data_value decimal(60,0),
    status varchar (60),
    units varchar (60),
    magnitude int(60),
    subject text(60),
    group text(60),
    series_title_1 varchar (60),
    series_title_2 varchar (60),
    series_title_3 varchar (60),
    series_title_4 varchar (60),
    series_title_5 varchar (60),
     );
  3. Besoin de connecter la base de données mysql dans le terminal.

    =>show databases;
    =>use database;
    =>show tables;
  4. Veuillez entrer cette commande pour importer les données csv dans les tables mysql.

    load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);
  5. Trouvez ces données d'index du commerce extérieur sur sqldatabase:

    select * from trade_index;
sivamani
la source
2

Si vous utilisez une machine Windows avec une feuille de calcul Excel chargée, le nouveau plugin mySql pour Excel est phénoménal. Les gens chez Oracle ont vraiment fait du bon travail sur ce logiciel. Vous pouvez établir la connexion à la base de données directement depuis Excel. Ce plugin analysera vos données et configurera les tables pour vous dans un format cohérent avec les données. J'avais quelques gros fichiers CSV de données à convertir. Cet outil était un gros gain de temps.

http://dev.mysql.com/downloads/windows/excel/

Vous pouvez effectuer des mises à jour à partir d'Excel qui alimenteront la base de données en ligne. Cela a très bien fonctionné avec les fichiers mySql créés sur un hébergement partagé GoDaddy ultra peu coûteux. (Notez que lorsque vous créez la table sur GoDaddy, vous devez sélectionner certains paramètres hors standard pour permettre l'accès hors site à la base de données ...)

Avec ce plugin, vous avez une interactivité pure entre votre feuille de calcul XL et le stockage de données mySql en ligne.

zipzit
la source
2

J'utilise mysql workbench pour faire le même travail.

  1. créer un nouveau schéma
  2. ouvrir le schéma nouvellement créé
  3. faites un clic droit sur "Tables" et sélectionnez "Assistant d'importation de données de table"
  4. donnez le chemin du fichier csv et le nom de la table et enfin configurez votre type de colonne car l'assistant définit le type de colonne par défaut en fonction de leurs valeurs.

Remarque: jetez un œil au fichier journal de mysql workbench pour toute erreur en utilisant "tail -f [mysqlworkbenchpath] /log/wb*.log"

Mehdi
la source
Merci beaucoup pour votre réponse - étant nouveau sur MySQL, je ne le savais pas - cela m'a aidé avec CSV. Maintenant, je dois également importer 10 tables d'Access - pensez-vous que le moyen le plus simple sera d'exporter ces tables dans Excel, d'Excel vers CSV, puis d'utiliser ces étapes?
Naomi
J'ai trouvé que cette méthode n'importait pas toutes les lignes :( Sur 5 342 lignes, elle n'a importé que 2 485 lignes pour moi. Pourquoi ça?
Naomi
Hé Naomi, si vous consultez le journal mysqlworkbench, il vous montrera pourquoi il a cessé d'importer des données. Vous pouvez avoir des valeurs nulles ou un type de non-correspondance dans votre fichier DB et CSV. Mais je recommande fortement de suivre la réponse de Juan (juste après moi). Sa solution est meilleure et plus propre que moi.
Mehdi
1

Voici un exemple de capture d'écran du fichier Excel:

entrez la description de l'image ici

Enregistrez sous et choisissez .csv.

Et vous aurez comme illustré ci-dessous une capture d'écran de données .csv si vous ouvrez en utilisant le bloc-notes ++ ou tout autre bloc-notes.

entrez la description de l'image ici

Assurez-vous de supprimer l'en-tête et d'aligner les colonnes dans .csv comme dans le tableau mysql. Remplacez nom_dossier par le nom de votre dossier

LOAD DATA LOCAL INFILE
'D: /folder_name/myfilename.csv' INTO TABLE mail FIELDS TERMINATED BY ',' (fname, lname, email, phone);

Si le big data, vous pouvez prendre du café et le charger!.

C'est tout ce dont vous avez besoin.

Magige Daniel
la source
0

Requête PHP pour importer le fichier csv dans la base de données mysql

$query = <<<EOF
            LOAD DATA LOCAL INFILE '$file'
             INTO TABLE users
             FIELDS TERMINATED BY ','
             LINES TERMINATED BY '\n'
             IGNORE 1 LINES
            (name,mobile,email)
    EOF;
if (!$result = mysqli_query($this->db, $query))
   {
        exit(mysqli_error($this->db));
   }

** Exemple de données de fichier CSV **

name,mobile,email
Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus
Suwarnakumar Kanapathipillai
la source
0

Modifiez le nom du serveur, le nom d'utilisateur, le mot de passe, le nom de la base de données, le chemin de votre fichier, le nom de la table et le champ qui se trouve dans votre base de données que vous souhaitez insérer

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "bd_dashboard";
    //For create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    $query = "LOAD DATA LOCAL INFILE 
                'C:/Users/lenovo/Desktop/my_data.csv'
                INTO TABLE test_tab
                FIELDS TERMINATED BY ','
                LINES TERMINATED BY '\n'
                IGNORE 1 LINES
                (name,mob)";
    if (!$result = mysqli_query($conn, $query)){
        echo '<script>alert("Oops... Some Error occured.");</script>';
        exit();
            //exit(mysqli_error());
       }else{
        echo '<script>alert("Data Inserted Successfully.");</script>'
       }
    ?>
Srikrushna
la source