Importer contenu de fichier csv dans base de données MySQL
Résolu/Fermé
sydko
Messages postés
4
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
11 novembre 2013
-
Modifié par sydko le 14/10/2013 à 17:54
Utilisateur anonyme - 16 oct. 2013 à 14:57
Utilisateur anonyme - 16 oct. 2013 à 14:57
A voir également:
- Importer un fichier csv dans mysql
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier host - Guide
- Ouvrir un fichier .bin - Guide
2 réponses
sydko
Messages postés
4
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
11 novembre 2013
5
Modifié par sydko le 16/10/2013 à 13:58
Modifié par sydko le 16/10/2013 à 13:58
Salut.
Merci nagashima pour tes propositions.
J'ai opté pour la première et mon code est plus efficace. Il n'y a plus de dupliqua sans raison.
Pour ceux à qui ça intéresserait, voici mon code:
Par contre ça m'a permis de voir clairement un autre problème caché que j'ignorais: DES POINT-VIRGULES (;) contenus dans mon fichier csv.
Encore merci à tous
Merci nagashima pour tes propositions.
J'ai opté pour la première et mon code est plus efficace. Il n'y a plus de dupliqua sans raison.
Pour ceux à qui ça intéresserait, voici mon code:
<?php
//connexion et selection de la base de données
$hostname = "localhost";
$database = "base";
$username = "root";
$password = "";
$connect = mysql_connect($hostname, $username, $password);
mysql_select_db($database, $connect);
//Faire une requete sql pour selectionner uniquement les numeros d'ordre de mvt puis mettre le resultat dans un tableau
$sql_num = "SELECT numero FROM table ";
$query_num = mysql_query($sql_num) or die ('Erreur SQL_num : '.mysql_error());
$data_num = mysql_fetch_assoc($query_num);
$tot_num = mysql_num_rows($query_num);
$tab_num = array();
$i = 0;
while($data_num = mysql_fetch_assoc($query_num)) {
$tab_num[$i] = $data_num['numero'];
$i++;
}
//Préparation des variables $DOSSIER, $FICHIER et $TABLE
$nom_fichier = 'dossier_de_fichiers_csv/fichier.csv'; //"nom_du_fichier_csv";
$nom_table = 'table'; //"nom_de_la_table_sql";
// Lancement de la lecture du fichier csv et insertion des données dans la table Mysql nom_de_ma_table_sql
$fichier = fopen($nom_fichier, "r"); //Ouverture du fichier en lecture
while (!feof($fichier)){//tant qu'on est pas a la fin du fichier :
// On recupere toute la ligne
$uneLigne = fgets($fichier, 4096);
//On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')
$tableauValeurs = explode(';', $uneLigne);
// Recensement des données, ici il y a 20 champs donc de [0] a [19]. (Etape facultative)
$valeurs = "('".$tableauValeurs[0]."', '".$tableauValeurs[1]."', '".$tableauValeurs[2]."', '".$tableauValeurs[3]."', '".$tableauValeurs[4]."', '".$tableauValeurs[5]."', '".$tableauValeurs[6]."', '".$tableauValeurs[7]."', '".$tableauValeurs[8]."', '".$tableauValeurs[9]."', '".$tableauValeurs[10]."', '".$tableauValeurs[11]."', '".$tableauValeurs[12]."', '".$tableauValeurs[13]."', '".$tableauValeurs[14]."', '".$tableauValeurs[15]."', '".$tableauValeurs[16]."', '".$tableauValeurs[17]."', '".$tableauValeurs[18]."', '".$tableauValeurs[19]."')";
//Vérification de la presence de la ligne dans la table
if(isset($tableauValeurs[15])){
if(($tableauValeurs[15] != "numero") && ($tableauValeurs[15] != 0) && !in_array($tableauValeurs[15], $tab_num)){
// On crée la requete pour inserer les donneés
$sql = "INSERT INTO ".$nom_table." VALUES ".$valeurs;
$req = mysql_query($sql)or die('<br> Erreur SQL ! '.$req.'<br />'.mysql_error());
}
else{ // Affiche le numero de la ligne qui n'a pas ete inserée
echo '<font style="color:red;">'.$tableauValeurs[15]."</font><br>";
}
}
// la ligne est finie donc on passe a la ligne suivante de la boucle While
}
//vérification et envoi d'une réponse à l'utilisateur
if ($req){
echo"Ajout dans la base de données effectué avec succès";
}
?>
Par contre ça m'a permis de voir clairement un autre problème caché que j'ignorais: DES POINT-VIRGULES (;) contenus dans mon fichier csv.
Encore merci à tous
Utilisateur anonyme
15 oct. 2013 à 09:22
15 oct. 2013 à 09:22
salut.
Pour ta question en fait il vaudrai mieux regarder dans la section php plutot que base de données car il semblerai que tu fasse ces traitement depuis un code php.
en fait tu as un fonction en mySQL pour importer un csv :
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
ceci étant dis, je suppose que dans ton code php tu fais des insert en masse, donc rien ne t'empêche :
- soit faire un select préalable pour vérifier que la donnée n'existe pas déjà (et dans ce cas tu ne fais pas l'insert)
- soit rajouter une clef unique sur X champs (la combinaison de ces champs devant être toujours différents) et effectuer un "insert ignore ... " permettant de ne pas inserer et ne pas générer d'erreur dans le cas où la clef (les X champ donc) existe déjà.
naga
Pour ta question en fait il vaudrai mieux regarder dans la section php plutot que base de données car il semblerai que tu fasse ces traitement depuis un code php.
en fait tu as un fonction en mySQL pour importer un csv :
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
ceci étant dis, je suppose que dans ton code php tu fais des insert en masse, donc rien ne t'empêche :
- soit faire un select préalable pour vérifier que la donnée n'existe pas déjà (et dans ce cas tu ne fais pas l'insert)
- soit rajouter une clef unique sur X champs (la combinaison de ces champs devant être toujours différents) et effectuer un "insert ignore ... " permettant de ne pas inserer et ne pas générer d'erreur dans le cas où la clef (les X champ donc) existe déjà.
naga
16 oct. 2013 à 14:57
Si c'est bon pour toi, peux-tu mettre ton sujet en résolu?
bon dev.
naga