J'ai un fichier de 350 Mo nommé text_file.txt
contenant ces données délimitées par des tabulations:
345868230 1646198120 1531283146 Keyword_1531283146 1.55 252910000
745345566 1646198120 1539847239 another_1531276364 2.75 987831000
...
Nom de la base de données MySQL: Xml_Date
Table de base de données: PerformanceReport
J'ai déjà créé la table avec tous les champs de destination.
Je veux importer ces données de fichier texte dans un MySQL. J'ai cherché sur Google et trouvé des commandes telles que LOAD DATA INFILE
et je ne comprenais pas trop comment l'utiliser.
Comment puis-je importer ces données de fichier texte?
Cela devrait être aussi simple que ...
LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport;
Par défaut, LOAD DATA INFILE
utilise des lignes délimitées par des tabulations, une ligne par ligne.
Procédure pas à pas pour utiliser la commande LOAD DATA de MySQL:
Créez votre table:
CREATE TABLE foo(myid INT, mymessage VARCHAR(255), mydecimal DECIMAL(8,4));
Créez votre fichier délimité par des tabulations (notez qu'il y a des tabulations entre les colonnes):
1 Heart disease kills 1.2
2 one out of every two 2.3
3 people in America. 4.5
Utilisez la commande load data:
LOAD DATA LOCAL INFILE '/tmp/foo.txt'
INTO TABLE foo COLUMNS TERMINATED BY '\t';
Si vous recevez un avertissement indiquant que cette commande ne peut pas être exécutée, vous devez activer le paramètre --local-infile=1
décrit ici: Comment corriger l'erreur de chargement MySQL
Les lignes sont insérées:
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
Vérifiez si cela a fonctionné:
mysql> select * from foo;
+------+----------------------+-----------+
| myid | mymessage | mydecimal |
+------+----------------------+-----------+
| 1 | Heart disease kills | 1.2000 |
| 2 | one out of every two | 2.3000 |
| 3 | people in America. | 4.5000 |
+------+----------------------+-----------+
3 rows in set (0.00 sec)
Comment spécifier les colonnes dans lesquelles charger les colonnes de votre fichier texte dans:
Comme ça:
LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
(@col1,@col2,@col3) set myid=@col1,mydecimal=@col3;
Le contenu du fichier est placé dans les variables @ col1, @ col2, @ col3. myid obtient la colonne 1 et mydecimal, la colonne 3. Si cela était exécuté, la deuxième ligne serait omise:
mysql> select * from foo;
+------+-----------+-----------+
| myid | mymessage | mydecimal |
+------+-----------+-----------+
| 1 | NULL | 1.2000 |
| 2 | NULL | 2.3000 |
| 3 | NULL | 4.5000 |
+------+-----------+-----------+
3 rows in set (0.00 sec)
Si votre table est séparée par d'autres que des tabulations, vous devez la spécifier comme suit:.
LOAD DATA LOCAL
INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport
COLUMNS TERMINATED BY '\t' ## This should be your delimiter
OPTIONALLY ENCLOSED BY '"'; ## ...and if text is enclosed, specify here
L'instruction LOAD DATA INFILE lit les lignes d'un fichier texte dans une table à une vitesse très élevée.
LOAD DATA INFILE '/tmp/test.txt'
INTO TABLE test
FIELDS TERMINATED BY ','
LINES STARTING BY 'xxx';
Si le fichier de données ressemble à ceci:
xxx"abc",1
something xxx"def",2
"ghi",3
Les lignes résultantes seront ("abc", 1) et ("def", 2). La troisième ligne du fichier est ignorée car elle ne contient pas le préfixe.
LOAD DATA INFILE 'data.txt'
INTO TABLE tbl_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
Vous pouvez aussi charger des fichiers de données en utilisant l'utilitaire mysqlimport; il fonctionne en envoyant une instruction LOAD DATA INFILE au serveur
mysqlimport -u root -ptmppassword --local test employee.txt
test.employee: Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
1. s'il s'agit d'un fichier txt délimité par des tabulations:
LOAD DATA LOCAL INFILE 'D: /MySQL/event.txt' INTO TABLE événement
LIGNES TERMINÉES PAR '\ r\n';
2. sinon:
LOAD DATA LOCAL INFILE 'D: /MySQL/event.txt' INTO TABLE événement
ZONES TERMINÉES PAR 'x' (ici, x pourrait être une virgule ',', onglet '\ t', point-virgule ';', espace '')
LIGNES TERMINÉES PAR '\ r\n';
Vous devriez définir l'option:
local-infile=1
dans votre entrée [mysql] du fichier my.cnf ou appelez le client mysql avec l'option --local-infile:
mysql --local-infile -uroot -pyourpwd yourdbname
Vous devez également vous assurer que le même paramètre est défini dans votre section [mysqld] pour activer le côté serveur "infile local".
C'est une restriction de sécurité.
LOAD DATA LOCAL INFILE '/softwares/data/data.csv' INTO TABLE tableName;
LOAD DATA INFILE '/home/userlap/data2/worldcitiespop.txt' INTO TABLE cc FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;