Comment importer un fichier CSV à la table MySQL
J'ai un CSV events-diary non normalisé d'un client que j'essaie de charger dans une table MySQL afin que je puisse refactoriser dans un format sain d'esprit. 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), sauf les colonnes qui contiennent des counts (représentés par INT), yes/no (représentés par BIT), prix (représentés par décimal), et texte blurbs (représentés par le texte).
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 |
...
Toute la table est remplie de NULL
.
Je pense que le problème est que les textes de présentation contiennent plus d'une ligne, et MySQL analyse le fichier comme si chaque nouvelle ligne correspondrait à une ligne databazse. Je peux charger le fichier dans OpenOffice sans problème.
Le clientdata.le fichier csv contient 2593 lignes et 570 enregistrements. La première ligne contient les noms de colonne. Je pense qu'il est délimité par des virgules, et le texte est apparemment délimité avec apostrophe.
Mise à 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 à l'instruction LOAD DATA
que OpenOffice était assez 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'enregistrements complètement NULL
, et aucune des données qui ont été chargées ne semble être dans le bon endroit.
15 réponses
Le cœur de votre problème semble correspondre aux colonnes du fichier CSV à celles de la table.
De nombreux clients MySQL graphiques ont de très belles boîtes de dialogue d'importation pour ce genre de chose.
Mon préféré pour le travail est basé sur Windows HeidiSQL . Il vous donne une interface graphique pour construire la commande LOAD DATA
; Vous pouvez la réutiliser par programme plus tard.
Capture D'écran: boîte de dialogue "Importer un fichier texte"
Pour ouvrir L'importation boîte de dialogue" textfile", allez à Tools > Import CSV file
:
Utiliser 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 le délimiteur un onglet, utilisez --fields-terminated-by='\t'
La manière la plus simple que j'ai importée 200 + lignes est ci-dessous la commande dans la fenêtre sql phpmyadmin
J'ai une simple table de pays avec deux colonnes CountryId, CountryName
Voici .données 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'apparaissent jamais, dans la deuxième colonne, sinon votre importation s'arrêtera
Je sais que le question est vieille, Mais je voudrais partager ce
J'ai Utilisé cette méthode pour importer plus de 100K enregistrements (~5MO) dans 0.046 sec
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, c'est-à-dire normalement, il ignore 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 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);
PhpMyAdmin {[2] } peut gérer l'importation CSV. Voici les étapes:
Préparez le fichier CSV pour avoir les champs dans le même ordre que les champs de la table MySQL.
Supprimez la ligne D'en-tête du fichier CSV (le cas échéant), de sorte que seules les données soient dans le fichier.
Accédez à l'interface phpMyAdmin.
Sélectionnez le tableau dans le menu de gauche.
Cliquez sur le bouton Importer en haut.
Accédez au CSV fichier.
Sélectionnez L'option "CSV using LOAD DATA".
Entrez ", "dans les" champs terminés par".
Entrez les noms des colonnes dans le même ordre que dans la table de base de données.
Cliquez sur le bouton go et vous avez terminé.
Ceci est une note que j'ai préparée pour mon utilisation future, et le partage ici si quelqu'un d'autre peut en bénéficier.
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,...);
...donc dans votre cas, vous devez indiquer le 99 colonnes dans l'ordre dans lequel elles apparaissent dans le fichier csv.
La ligne de commande mysql est sujette à trop de problèmes lors de l'importation. Voici comment vous le faites:
- utilisez excel pour modifier les noms d'en-tête pour ne pas avoir d'espaces
- Enregistrer sous .csv
- Utilisez 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 primaire pour ID
- modifiez le type des colonnes comme vous le souhaitez.
- fait!
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;
Ignorer 1 lignes ici ignore 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.
Vous pouvez également essayer cet outil en ligne pour générer des instructions SQL create / insert basées sur votre CSV. http://www.convertcsvtomysql.com/
Ce que j'aime dans cet outil:
- Simple
- il génère non seulement des instructions INSERT, mais aussi des instructions CREATE pour générer une table
- lors de la génération des instructions CREATE, cet outil ne fait pas seulement varier tous les champs - il analyse les données dans votre CSV, et en fonction de cette analyse, il choisit les données appropriées type.
Inconvénients
- La Taille du fichier D'entrée est limitée à 3 Mo
- vous pourriez ne pas être prêt à donner vos données à un tiers
Si vous utilisez MySQL Workbench (actuellement la version 6.3), vous pouvez le faire en:
- Faites un clic droit sur "Tables";
- Choisissez Assistant D'Importation De Données De Table;
- 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 basée sur le fichier csv que vous souhaitez importer ou charger des données dans une table existante
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 D'Oracle ont vraiment fait un bon travail sur ce logiciel. Vous pouvez établir la connexion à la base de données directement à partir D'Excel. Ce plugin va analyser vos données, et mettre en place les tables pour vous dans un format cohérent avec les données. J'ai eu quelques gros fichiers CSV monstres de données à convertir. Cet outil a été un grand gain de temps.
Http://dev.mysql.com/downloads/windows/excel/
Vous pouvez effectuer des mises à jour à partir D'Excel qui rempliront la base de données en ligne. Cela a très bien fonctionné avec les fichiers mySql créés sur L'hébergement partagé GoDaddy ultra bon marché. (Remarque Lorsque vous créez la table sur GoDaddy, vous devez sélectionner des paramètres hors norme pour activer l'accès hors site de la base de données...)
Avec ce plugin, vous avez une interactivité pure entre votre feuille de calcul XL et mySql en ligne le stockage de données.
Changer le nom du serveur,nom d'utilisateur, mot de passe,dbname,chemin d'accès à votre fichier, 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>'
}
?>
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
Voici un exemple de capture d'écran de fichier excel:
Enregistrer sous et choisir .csv.
Et vous aurez comme indiqué ci-dessous .capture d'écran de données csv si vous ouvrez en utilisant notepad++ ou tout autre bloc-notes.
Assurez-vous de supprimer l'en-tête et d'avoir un alignement de colonne.csv comme dans la Table mysql. Remplacez folder_name par votre nom de dossier
CHARGER LES DONNÉES LOCAL INFILE
'D:/folder_name/myfilename.csv'
Dans la table mail
FIELDS TERMINATED BY ','
(fname,lname ,email, téléphone);
Si big data, vous pouvez prendre du café et le charger!.
C'est tout ce dont vous avez besoin.
Une autre solution consiste à utiliser l'outilcsvsql de amazingcsvkit suite.
Exemple d'Utilisation:
csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename $file
Cet outil peut déduire automatiquement les types de données (comportement par défaut), créer une table et insérer les données dans la table créée. --overwrite
option peut être utilisée pour supprimer la table si elle existe déjà. --insert
option - pour remplir la table à partir du fichier.
Pour installer la suite
pip install csvkit
Conditions Préalables: python-dev
, libmysqlclient-dev
, MySQL-python
apt-get install python-dev libmysqlclient-dev
pip install MySQL-python