web-dev-qa-db-fra.com

Comment importer plusieurs fichiers csv dans une base de données MySQL

Est-il possible d'importer plusieurs fichiers csv simultanément dans une base de données MySQL? Une sorte d'importation par lots?

Je suis sous Mac OSX sur un serveur MAMP. 

J'ai 185 fichiers CSV que je dois importer dans une table MySQL. Je peux les importer individuellement en utilisant l'onglet d'importation de phpMyAdmin, mais cela prendrait beaucoup de temps. Est-ce que quelqu'un sait s'il y a un meilleur moyen?

11
Laxmidi

Utilisez un script Shell comme ceci:

#!/usr/bin/env bash
cd yourdirectory
for f in *.csv
do
        mysql -e "USE yourDatabase LOAD DATA LOCAL INFILE '"$f"'INTO TABLE yourtable"
done
12
nazar554

Il y a un petit script PHP pour vous:

#!/usr/bin/php
<?
mysql_connect('localhost','root','root'); // MAMP defaults
mysql_select_db('yourdatabase');
$files = glob('*.csv');
foreach($files as $file){
    mysql_query("LOAD DATA INFILE '".$file."' INTO TABLE yourtable");
}

Consultez le manuel de MySQL pour LOAD DATA INFILE les options qui correspondent à vos documents.

8
konsolenfreddy

Vous pouvez utiliser un script Shell pour parcourir les fichiers (celui-ci suppose qu'ils se trouvent dans le répertoire en cours):

#!/bin/bash

for f in *.csv
do
    mysql -e "load data infile '"$f"' into table my_table" -u username --password=your_password my_database
done
3
Tom H

J'ai modifié le script de Tom pour résoudre quelques problèmes rencontrés

#!/bin/bash

for f in *.csv
do
    mysql -e "load data local infile '"$f"' into table myTable fields TERMINATED BY ',' LINES TERMINATED BY '\n'"  -u myUser--password=myPassword fmeter --local-infile
done
  1. load data local infile au lieu de load data infile: [le fichier à charger était local sur le serveur mysql]
  2. Ajout de commutateurs délimiteurs pour correspondre à mes données.
  3. --local-infile pour activer le mode de chargement de données local sur le client.
2
Abhijeet Apsunde

Pour l'utilisateur Windows, utilisez ce lot

echo off
setlocal enabledelayedexpansion
FOR %%f IN ("*.csv") DO (
  set old=%%~dpnxf
  set new=!old:\=\\!
  mysql -e "load data local infile '"!new!"' IGNORE into table email_us.business  COLUMNS TERMINATED BY ','" -u root
  echo %%~nxf DONE
)
  • email_us -> DB 
  • business -> Table
  • IGNORE -> Ignorer les doublons et continuer en cas d'erreur 
  • ~ dpnxf -> d pour la lettre du lecteur, p pour le chemin du fichier, n pour le nom du fichier, x pour l’extension et f est une variable de fichier

Étapes: - Placez ce fichier de commandes dans un répertoire contenant tous les fichiers csv et nommez-le sous le nom quelquechose.bat - exécutez cmd.exe en tant qu’administrateur et appelez-le. ..

1
Wasim A.

@hlosukwakha vous voulez utiliser mysqlimport. ceci recherche une table nommée comme le fichier. utilisez mysqlimport -help pour trouver les paramètres corrects, mais ils sont fondamentalement identiques à mysql.

0
Oskar Must

En python, vous pouvez utiliser d6tstack , ce qui rend cela simple

import d6tstack
import glob

c = d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'))
c.to_mysql_combine('mysql+mysqlconnector://usr:pwd@localhost/db', 'tablename')

Il traite également avec data changes schema , crée une table et vous permet de prétraiter les données.

0
citynorman