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.
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.
Capture d'écran: boîte de dialogue "Import textfile"
Pour ouvrir la boîte de dialogue "Import textfile", allez à Tools > Import CSV file
:
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'
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 .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
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);
phpMyAdmin peut gérer l’importation CSV. Voici les étapes:
Préparez le fichier CSV pour que les champs soient 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 figurent dans le fichier.
Allez à l'interface phpMyAdmin.
Sélectionnez la table dans le menu de gauche.
Cliquez sur le bouton d'importation en haut.
Accédez au fichier CSV.
Sélectionnez l'option "CSV utilisant LOAD DATA".
Entrez "," dans les "champs terminés par".
Entrez les noms de colonne 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 que je partage ici si quelqu'un d'autre peut en bénéficier.
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.
La ligne de commande mysql est sujette à trop de problèmes lors de l'importation. Voici comment vous le faites:
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.
Si vous utilisez MySQL Workbench (version 6.3 actuelle), vous pouvez le faire en:
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:
Désavantages
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.
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>'
}
?>
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.
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.
pip install csvkit
Prérequis:python-dev
, libmysqlclient-dev
, MySQL-python
apt-get install python-dev libmysqlclient-dev
pip install MySQL-python
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:
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.
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.
Comment importer des fichiers CSV dans des tables SQL
Exemple de fichier: fichier CSV Overseas_trade_index
data
Pas:
Besoin de créer une table pour overseas_trade_index
.
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),
);
Besoin de connecter la base de données mysql dans le terminal.
=>show databases;
=>use database;
=>show tables;
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);
Retrouvez ces données d'indice de commerce international sur sqldatabase:
select * from trade_index;
Si vous utilisez Intellij https://www.jetbrains.com/datagrip/features/importexport.html
J'utilise mysql workbench pour faire le même travail.
Remarque: consultez le fichier journal de mysql workbench pour rechercher les erreurs éventuelles en utilisant "tail -f [mysqlworkbenchpath] /log/wb*.log"