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
Bonjour.
Je vous expose mon problème.
J'ai une table à mettre à jour automatique toute les heure à partir de fichier csv que ma plateforme web recevra.
J'ai fouillé et j'ai trouvé un code qui me permet de faire:
1- lecture du fichier ".csv"
2- collectes des données du ".csv" dans un tableau
3- insertion dans la table
et ça marche.

Mais mon problème est que , il peut arriver qu'une donnée existant dans la base soit aussi présente dans le fichier ".csv" à importer.
Jusque là, j'ai utilisé la fonction array_splice() pour supprimer ces lignes. Lorsque je fais un count($tableau) il m'affiche une valeur qui me fait savoir que des lignes ont bien été enlevées; lorsque j'exécute mon insertion, il m'affiche toujours qu'une ligne est dupliquée.

Comment puis-je faire pour éliminer ces lignes dupliquées avant mon insertion dans ma table MySQL?

Quelqu'un a-t il déjà été confronté à cette situation et/ou pourrait-il me preter main forte?
merci beaucoup!
A voir également:

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
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:

<?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
5
Utilisateur anonyme
16 oct. 2013 à 14:57
Ok parfais =)

Si c'est bon pour toi, peux-tu mettre ton sujet en résolu?

bon dev.

naga
0
Utilisateur anonyme
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
1