99 votes

Comment importer un fichier CSV dans une table MySQL

Comment importer un fichier CSV dans une table MySQL ? Je voudrais que la première ligne de données soit utilisée comme nom de colonne.

Je lis Comment importer un fichier CSV dans une table MySQL ? mais la seule réponse était d'utiliser une interface graphique et non un shell ?

3 votes

Et même la solution GUI ne prend pas les noms de colonnes à partir du csv... vous devez créer la table entière avant l'importation...

1 votes

La question a déjà une réponse ici stackoverflow.com/questions/3635166/

0 votes

La réponse acceptée à la question à laquelle vous faites référence utilisait une interface graphique. La réponse à laquelle vous faites référence a été fournie hier alors que cette question (réponse) date de 2012.

150voto

hjpotter92 Points 24797

Au lieu d'écrire un script pour extraire des informations d'un fichier CSV, vous pouvez lier directement MYSQL et télécharger les informations en utilisant la syntaxe SQL suivante.

Pour importer un fichier Excel dans MySQL, il faut d'abord l'exporter sous forme de fichier CSV. Supprimez les en-têtes CSV du fichier CSV généré ainsi que les données vides qu'Excel a pu placer à la fin du fichier CSV.

Vous pouvez ensuite l'importer dans une table MySQL en exécutant :

load data local infile 'uniq.csv' into table tblUniq fields terminated by ','
  enclosed by '"'
  lines terminated by '\n'
    (uniqName, uniqCity, uniqComments)

comme lu sur : Importez un fichier CSV directement dans MySQL

EDITAR

Dans votre cas, vous devrez d'abord écrire un interprète pour trouver la première ligne et l'assigner comme nom de colonne.


EDIT-2

Extrait de la documentation MySQL sur LOAD DATA syntaxe :

El IGNORE number LINES peut être utilisée pour ignorer les lignes à la position début du fichier. Par exemple, vous pouvez utiliser IGNORE 1 LINES à sauter sur une première ligne d'en-tête contenant les noms des colonnes :

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

Par conséquent, vous pouvez utiliser la déclaration suivante :

LOAD DATA LOCAL INFILE 'uniq.csv'
INTO TABLE tblUniq
FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(uniqName, uniqCity, uniqComments)

8 votes

Au lieu de supprimer la première ligne, vous pouvez ajouter IGNORE 1 LINES à la requête

0 votes

Savez-vous s'il existe un moyen de définir le chemin d'accès au fichier csv ?

0 votes

Comment déboguer cette commande lorsqu'elle échoue ? J'essaie de charger un fichier avec cette commande mais elle ne fait rien.

26voto

Hawkee Points 1341

Voici une simple ligne de commande PHP script qui fera ce dont vous avez besoin :

<?php

$host = 'localhost';
$user = 'root';
$pass = '';
$database = 'database';

$db = mysql_connect($host, $user, $pass);
mysql_query("use $database", $db);

/********************************************************************************/
// Parameters: filename.csv table_name

$argv = $_SERVER[argv];

if($argv[1]) { $file = $argv[1]; }
else {
    echo "Please provide a file name\n"; exit; 
}
if($argv[2]) { $table = $argv[2]; }
else {
    $table = pathinfo($file);
    $table = $table['filename'];
}

/********************************************************************************/
// Get the first row to create the column headings

$fp = fopen($file, 'r');
$frow = fgetcsv($fp);

foreach($frow as $column) {
    if($columns) $columns .= ', ';
    $columns .= "`$column` varchar(250)";
}

$create = "create table if not exists $table ($columns);";
mysql_query($create, $db);

/********************************************************************************/
// Import the data into the newly created table.

$file = $_SERVER['PWD'].'/'.$file;
$q = "load data infile '$file' into table $table fields terminated by ',' ignore 1 lines";
mysql_query($q, $db);

?>

Il créera un tableau basé sur la première ligne et y importera les lignes restantes. Voici la syntaxe de la ligne de commande :

php csv_import.php csv_file.csv table_name

2 votes

Génial script. Pour ceux qui ont des fichiers CSV entre guillemets (comme la plupart des gens), ajoutez ` ENCASED IN '\"'` à fields terminated by ',' ...cela fonctionne même avec des CSV partiellement entre guillemets.

3 votes

Je pense que vous voulez dire ENCLOSED BY '\"' ... aussi, beaucoup de gens auront besoin de LINES TERMINATED BY '\r\n' si vous utilisez un CSV depuis Windows. Enfin, il est judicieux d'échapper les noms de champ par des barres obliques inversées en cas de présence d'espaces : $columns .= "`$column` varchar(250)";

1 votes

Cette réponse est bien meilleure que la réponse acceptée. En particulier, elle permet ce que le PO a demandé, et que je veux aussi : "la première ligne de données soit utilisée comme nom de colonne". (Je préférerais un script en Python, pour ne pas avoir à installer PHP, mais ça ne devrait pas être difficile de le porter).

5voto

Jose Ortiz Points 27

Si vous avez la possibilité d'installer phpadmin il y a une section d'importation où vous pouvez importer des fichiers csv à votre base de données il y a même une case à cocher pour définir l'en-tête à la première ligne du fichier contient les noms de colonne de la table (si cela est décoché, la première ligne fera partie des données

1 votes

Je suis vraiment surpris que l'on doive utiliser un module complémentaire comme phpadmin pour obtenir cette fonctionnalité.

0 votes

Cela a fait ma journée.

3voto

Muk Points 1298

Créez d'abord une table dans la base de données avec le même nombre de colonnes que dans le fichier csv.

Ensuite, utilisez la requête suivante

LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'

0 votes

Comment faire si je veux ignorer une colonne dans le csv ?

2voto

Rakesh Points 1

Pour charger des données à partir d'un fichier texte ou d'un fichier csv, la commande est la suivante

load data local infile 'file-name.csv'
into table table-name
fields terminated by '' enclosed by '' lines terminated by '\n' (column-name);

Dans la commande ci-dessus, dans mon cas il n'y a qu'une seule colonne à charger donc il n'y a pas de "terminated by" et "enclosed by" donc je l'ai gardé vide sinon le programmeur peut entrer le caractère de séparation . par exemple . (virgule) ou " ou ; ou toute autre chose.

**pour les personnes qui utilisent mysql version 5 et supérieure **

Avant de charger le fichier dans mysql doit s'assurer que la ligne ci-dessous sont ajoutés dans le côté etc/mysql/my.cnf

pour éditer la commande my.cnf est

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X