MYSQL importer des données à partir de csv à l'aide de LOAD DATA INFILE

106

J'importe des données de 20000 lignes à partir d'un fichier CSV dans Mysql.

Les colonnes du CSV sont dans un ordre différent de celui des colonnes de la table MySQL. Comment attribuer automatiquement des colonnes correspondant aux colonnes de la table Mysql?

Quand j'exécute

LOAD DATA INFILE'abc.csv' INTO TABLE abc

cette requête ajoute toutes les données à la première colonne.

Veuillez suggérer une syntaxe automatique pour l'importation de données dans Mysql.

MANJEET
la source
Il y a un sujet similaire dans stackoverflow.com/questions/11077801/import-csv-to-mysql-table/…
marciomolusco
Cela m'est arrivé, j'ai découvert que le fichier texte était écrit avec des lignes terminées par '\ r' et j'essayais d'importer les données en m'attendant à ce que les lignes soient terminées en utilisant le '\ n'
Tamer
2
J'ai écrit un tutoriel complet pour charger des données csv dans mysql avec un outil générateur de syntaxe dans Excel . Cela devrait être utile aux lecteurs.
mysql_user

Réponses:

169

Vous pouvez utiliser la commande LOAD DATA INFILE pour importer le fichier csv dans la table.

Vérifiez ce lien MySQL - LOAD DATA INFILE .

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

Pour les utilisateurs de MySQL 8.0:

L'utilisation du LOCALmot clé hold security risk et à partir de MySQL 8.0, la LOCALcapacité est définie Falsepar défaut. Vous pourriez voir l'erreur:

ERREUR 1148: la commande utilisée n'est pas autorisée avec cette version de MySQL

Vous pouvez l'écraser en suivant les instructions de la documentation . Sachez qu'un tel écrasement ne résout pas le problème de sécurité, mais reconnaît simplement que vous êtes conscient et disposé à prendre le risque.

Saharsh Shah
la source
1
Puis-je savoir ce IGNORE 1 LINESque fait exactement ici? Merci d'avance.
Koushik Das
5
@KoushikDas Il ignorera la première ligne qui définit les noms de colonne
Saharsh Shah
28
attention: la clause LINES TERMINATED BY '\ r \ n' fonctionne pour les fichiers Windows, mais les fichiers Linux ne doivent avoir que '\ n'.
ChuckCottrill
1
Il est important de se rappeler d'utiliser des barres obliques: stackoverflow.com/a/42878067/470749
Ryan
3
juste une note que le (col1, col2, col3 ....) n'est pas obligatoire. Utile si vous créez une table à la volée avant de l'utiliser pour insérer des données.
Kieran Quinn
51

Vous devez probablement définir le FIELDS TERMINATED BY ','ou quel que soit le délimiteur.

Pour un fichier CSV, votre déclaration doit ressembler à ceci:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
ckim
la source
1
LOAD DATA LOCAL INFILE ... Sans LOCAL, l'accès a été refusé.
ketankk
49

Avant d'importer le fichier, vous devez préparer les éléments suivants:

  • Une table de base de données dans laquelle les données du fichier seront importées.
  • Un fichier CSV avec des données qui correspondent au nombre de colonnes de la table et au type de données dans chaque colonne.
  • Le compte, qui se connecte au serveur de base de données MySQL, dispose des privilèges FILE et INSERT.

Supposons que nous ayons le tableau suivant:

entrez la description de l'image ici

CRÉER UNE TABLE À L'AIDE DE LA QUESTION SUIVANTE:

CREATE TABLE IF NOT EXISTS `survey` (
  `projectId` bigint(20) NOT NULL,
  `surveyId` bigint(20) NOT NULL,
  `views` bigint(20) NOT NULL,
  `dateTime` datetime NOT NULL
);

VOTRE FICHIER CSV DOIT ÊTRE CORRECTEMENT FORMATÉ PAR EXEMPLE VOIR L'IMAGE CI-JOINT:

entrez la description de l'image ici

Si tout va bien. Veuillez exécuter la requête suivante pour LOAD DATA FROM CSV FILE:

REMARQUE: veuillez ajouter le chemin absolu de votre fichier CSV

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Si tout a été fait. vous avez exporté les données du CSV vers la table avec succès

Sunny SM
la source
Comment pouvons-nous valider si le fichier CSV a un type de données approprié pour chaque colonne, car par défaut, il ignore le type de données invalide.
Umar Abbas
2
Désolé de déranger sur une si vieille réponse. C'est très convaincant mais comment puis-je sauter un champ. Disons que ma table a projectId, surveyId et dateTime, comment puis-je ignorer le champ "vues"?
Danish Ansari
@MD Danish Ansari, Désolé de répondre à une ancienne question, mais vous pouvez spécifier les colonnes du tableau. J'ai fait ce qui suit, où je dois ignorer le premier champ (une clé primaire à auto-incrémentation), ainsi que quelques autres champs: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'INTO TABLE my_log_tbl FIELDS TERMINATED BY', 'ENCLOSED BY' "'LINES TERMINATED BY' \ r \ n '(UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); j'avais pensé que les colonnes devaient venir après le nom de la table, mais cela n'a pas fonctionné. Ils devraient apparaître à la fin.
kalinma
17

Syntaxe:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name' INTO TABLE `tbl_name`
CHARACTER SET [CHARACTER SET charset_name]
FIELDS [{FIELDS | COLUMNS}[TERMINATED BY 'string']] 
[LINES[TERMINATED BY 'string']] 
[IGNORE number {LINES | ROWS}]

Voir cet exemple:

LOAD DATA LOCAL INFILE
'E:\\wamp\\tmp\\customer.csv' INTO TABLE `customer`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
Md. Nashir Uddin
la source
10

Insérer en masse plus de 7000000 enregistrements en 1 minute dans la base de données (requête ultra-rapide avec calcul)

mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ');
$affected = (int) (mysqli_affected_rows($cons))-1; 
$log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP et RRP_nl et RRP_bl ne sont pas en csv mais nous sommes calculés et après insérer cela.

krunal panchal
la source
2

Si vous exécutez à LOAD DATA LOCAL INFILEpartir du shell Windows et que vous devez utiliser OPTIONALLY ENCLOSED BY '"', vous devrez faire quelque chose comme ceci afin d'échapper correctement les caractères:

"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql" -u root --password=%password% -e "LOAD DATA LOCAL INFILE '!file!' INTO TABLE !table! FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"^""' LINES TERMINATED BY '\n' IGNORE 1 LINES" --verbose --show-warnings > mysql_!fname!.out
Kikoz
la source
2

supposons que vous utilisez xampp et phpmyadmin

vous avez le nom de fichier «ratings.txt» le nom de la table «les évaluations» et le nom de la base de données «films»

si votre xampp est installé dans "C: \ xampp \"

copiez votre fichier "ratings.txt" dans le dossier "C: \ xampp \ mysql \ data \ movies"

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

J'espère que cela peut vous aider à omettre votre erreur si vous faites cela sur localhost

Mohammad Arshi
la source
0

Vous pouvez charger des données à partir d'un fichier csv ou texte. Si vous disposez d'un fichier texte avec des enregistrements d'une table, vous pouvez charger ces enregistrements dans la table. Par exemple, si vous avez un fichier texte, où chaque ligne est un enregistrement avec les valeurs de chaque colonne, vous pouvez charger les enregistrements de cette façon.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

--exemple sur Windows

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 
Jorge T
la source
0

J'obtenais le code d'erreur: 1290. Le serveur MySQL fonctionne avec l'option --secure-file-priv donc il ne peut pas exécuter cette instruction

Cela a fonctionné pour moi sur Windows 8.1 64 bits en utilisant wampserver 3.0.6 64 bits.

Modification du fichier my.ini depuis C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Supprimer l'entrée secure_file_priv c: \ wamp64 \ tmp \ (ou quel que soit le répertoire que vous avez ici)

Tout arrêté -exit wamp etc.- et tout redémarré; puis punt mon fichier cvs sur C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (le dernier répertoire étant le nom de ma base de données)

exécuté LOAD DATA INFILE 'myfile.csv'

ANCIENS EN TABLE

CHAMPS TERMINÉS PAR ','

ENFERMÉ PAR '"'

LIGNES TERMINÉES PAR '\ r \ n'

IGNORER 1 LIGNES

... et VOILA !!!

Carlos Garcia
la source
0

Vous pouvez essayer d'insérer comme ceci:

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);
Hozayfa
la source
0

De nos jours (fin 2019), je préfère utiliser un outil comme http://www.convertcsv.com/csv-to-sql.htm Je vous ai beaucoup de lignes que vous pouvez exécuter des blocs partitionnés en sauvant les erreurs de l'utilisateur lorsque csv provient une feuille de calcul de l'utilisateur final.

Jonathan Perrotta
la source