web-dev-qa-db-fra.com

Comment importer un fichier CSV dans une table MySQL

J'ai un fichier CSV d'événements non normalisé d'un journal que j'essaie de charger dans une table MySQL afin de pouvoir refactoriser dans un format sain. J'ai créé une table appelée "CSVImport" qui comporte un champ pour chaque colonne du fichier CSV. Le fichier CSV contient 99 colonnes. Il s’agissait donc d’une tâche assez ardue en elle-même:

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 ne concerne la table et tous les champs contiennent des valeurs VARCHAR (256), à l'exception des colonnes contenant des nombres (représentés par INT), des oui/non (représentés par des BIT), des prix (représentés par DECIMAL) et des textes de synthèse ( 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 avec NULL.

Je pense que le problème est que les textes de texte contiennent plusieurs lignes et que MySQL analyse le fichier comme si chaque nouvelle ligne correspondait à une ligne databazse. 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 de colonnes. Je pense qu'il est délimité par des virgules et que le texte est apparemment délimité par une citation double.

METTRE À JOUR:

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

J'ai ajouté des informations à l'instruction LOAD DATA qu'OpenOffice était assez intelligent pour 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;

Cependant, il existe toujours de nombreux enregistrements NULL et aucune des données chargées ne semble être au bon endroit.

255

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

De nombreux clients graphiques MySQL ont de très jolis dialogues d'importation pour ce genre de choses. 

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

 Import textfile

Capture d'écran: boîte de dialogue "Import textfile"

Pour ouvrir la boîte de dialogue "Import textfile", allez à Tools > Import CSV file:

 enter image description here

117
Pekka 웃

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é à http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

Pour que le délimiteur devienne un onglet, utilisez --fields-terminated-by='\t'

170
michalzuber

La manière la plus simple d'importer plus de 200 lignes est sous la commande dans la fenêtre phpmyadmin sql

J'ai un tableau simple de pays avec deux colonnes CountryId, CountryName

voici les données .csvCSV FILE

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

73
DareDevil

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

J'ai utilisé cette méthode pour importer plus de 100 000 enregistrements ( ~ 5 Mo ) en 0.046sec  

Voici comment vous le faites: 

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, 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 ayez la première ligne comme titre pour vos champs, vous pouvez é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);
53
Fahad

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 fichier CSV (le cas échéant), de sorte que seules les données figurent dans le fichier.

  3. Allez à l'interface phpMyAdmin.

  4. Sélectionnez la table 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 go 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.

24
Farhan

Vous pouvez résoudre ce problème en listant les colonnes dans votre instruction LOAD DATA. De la manuel :

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

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

11
lafncow

La ligne de commande mysql est sujette à trop de problèmes lors de l'importation. Voici comment vous le faites:

  • utiliser Excel pour modifier les noms d'en-tête sans espaces
  • enregistrer en tant que .csv
  • utilisez gratuitement Navicat Lite Sql Browser pour importer et créer automatiquement une nouvelle table
  • ouvrir la nouvelle table insérer une colonne de numéro automatique primaire pour ID
  • changez le type des colonnes comme vous le souhaitez.
  • terminé!
7
user1464271

Essayez ceci, cela a fonctionné 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 contenant les noms de champs. Notez que pour le nom de fichier, vous devez taper le chemin absolu du fichier.

6
David

Si vous utilisez MySQL Workbench (version 6.3 actuelle), 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 peut également être utilisé); L'avantage 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.

 enter image description here

3
Vitaliy Pak

Vous pouvez également essayer cet outil en ligne pour générer des instructions SQL de création/insertion basées sur votre CSV . http://www.convertcsvtomysql.com/

Ce que j'aime de cet outil:

  • Simple
  • Il génère non seulement des instructions INSERT, mais également des instructions CREATEpour générer une table
  • Lors de la génération d'instructions CREATE, cet outil crée non seulement tous les champs VARCHAR, il analyse les données de votre fichier CSV et, en fonction de cette analyse, choisit le type de données approprié.

Désavantages

  • La taille du fichier d'entrée est limitée à 3 Mo
  • Vous n'êtes peut-être pas disposé à donner vos données à un tiers
2
Ievgen

Je vois quelque chose d'étrange. Vous utilisez pour ÉCHAPPER le même caractère que pour ENCLOSING. Donc le moteur ne sait pas quoi faire quand il fonde un "" "et je pense que c'est pourquoi rien ne semble être au bon endroit ... :

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

Sauf si vous analysez (manuellement, visuellement, ...) votre CSV et trouvez le personnage à utiliser pour vous échapper. Parfois, c'est '\'. Mais si vous ne l'avez pas, ne l'utilisez pas.

1
Juan

Changer le nom du serveur, nom d'utilisateur, mot de passe, nom de la base de données, chemin de votre fichier, nom du fichier 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>'
       }
    ?>
1
Srikrushna Pal

Si vous utilisez une machine Windows avec une feuille de calcul Excel chargée, le nouveau plug-in mySql pour Excel est phénoménal. Les gens chez Oracle ont vraiment fait du bon travail avec ce logiciel. Vous pouvez établir la connexion à la base de données directement à partir d'Excel. Ce plugin analysera vos données et configurera les tables pour vous dans un format cohérent avec les données. J'ai eu quelques gros fichiers csv de monstre à convertir. Cet outil a permis de gagner beaucoup de temps. 

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

Vous pouvez effectuer des mises à jour à partir d’Excel qui seront intégrées à la base de données en ligne. Cela a très bien fonctionné avec les fichiers mySql créés sur l’hébergement mutualisé extrêmement économique de GoDaddy. (Remarque: lorsque vous créez la table sur GoDaddy, vous devez sélectionner certains paramètres non conformes pour permettre l'accès hors site de la base de données ...)

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

1
zipzit

Une autre solution consiste à utiliser csvsql tool de amazing csvkit suite.

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. L'option --overwrite peut être utilisée pour supprimer une table si celle-ci existe déjà. --insert option - pour renseigner la table à 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
1
ruvim

PHP Requête pour importer un 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,[email protected]
Brandon Wilson,541-309-5149,[email protected]
Craig White,516-795-8065,[email protected]
David Whitney,713-214-3966,[email protected]

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

 enter image description here

Enregistrez sous et choisissez .csv.

Et vous aurez, comme indiqué ci-dessous, une capture d'écran de données .csv si vous ouvrez à l'aide de Notepad ++ ou de tout autre bloc-notes.

 enter image description here

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

LOAD DATA LOCAL INFILE
'D:/nom_fichier/monfichier.csv' INTO TABLE mail ZONES TERMINÉES PAR ',' (Fname, lname, email, phone);

Si Big Data, vous pouvez prendre du café et le charger!.

C'est tout ce dont vous avez besoin. 

1
Magige Daniel

Comment importer des fichiers CSV dans des tables SQL

Exemple de fichier: fichier CSV Overseas_trade_index data

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. Retrouvez ces données d'indice de commerce international sur sqldatabase:

    select * from trade_index;
    
0
sivamani
0
Georgy Gobozov

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. indiquez le chemin d'accès au fichier csv et le nom de la table, puis configurez votre type de colonne car l'assistant définit le type de colonne par défaut en fonction de leurs valeurs.

Remarque: consultez le fichier journal de mysql workbench pour rechercher les erreurs éventuelles en utilisant "tail -f [mysqlworkbenchpath] /log/wb*.log"

0
Mehdi