Création d'une base de donné a partir des fichiers csv

Fermé
moi0528 - 6 janv. 2016 à 21:41
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016 - 14 janv. 2016 à 15:30
Bonjour tout le monde , je viens vers vous parce que j'ai besoin d'un coup de main pour que je puisse avancée .

je suis en stage dans une entreprise et il m'en demandé de créer une base de donné a partir de plusieurs fichier csv c'est a dire ils veulent avoir tous le contenu des fichier dans une base de données pour qu'il puissent par la suite l'interroger avec des requêtes SQL.
j'ai 12 dossier (les mois de l'année) et chaque dossier contiens un certains nombre de fichier csv et chaque fichier csv contient des informations du client (environ 10 champs séparée par des virgules).

je sait faire la conception Merise (MCD-->MPD-->ficher sql de creation de la base) mais je sais pas par quoi commencé, j'ai passé une semaine a lire l’énoncé mais je trouve pas le fil de début pour pouvoir démarré .
merci d'avance pour votre assistance
A voir également:

7 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
7 janv. 2016 à 10:21
Bonjour,

</block>mais je sais pas par quoi commencé,
</block>
Ben... vu que :

je sait faire la conception Merise (MCD-->MPD-->ficher sql de creation de la base)


Je ne vois pas pourquoi tu demandes...

Tu prends tes fichiers CSV ...
Tu reperds les différentes colonnes (et leur type ... date / text... numérique.... )
Tu regardes si certaines choses peuvent être commune à tes différents fichiers
...et ...ben.. tu créés ton MCD.....

1
merci jordane45, effectivement je suis entrain d’écrire un scrpit php pour pouvoir charger ma table de la base de donné .
j'ai créer une petite formulaire qui va permettre a l'utilisateur de joindre un fichier a partir du bureau puis une fois clic sur envoyer le contenu du fichier sera envoyer vers ma table .
j'ai écris ce code mais je le sens pas, je sais pas si je suis a coté de la plaque ou je dois continuer dans cette ligne
<?php
if (isset($_POST['userfile'])){
 $userfile=$_POST['userfile'];
 unset ($_POST['userfile']);
}
else {
 $userfile='';
}


try
{
 $db = new PDO('mysql:host=localhost;dbname=mabase;charset=utf8', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
$sql=(" LOAD DATA LOCAL INFILE '$userfile'
INTO TABLE facture
FIELDS TERMINATED BY ';' 

 
IGNORE 1 LINES ");

$result=$db->query($sql);


?>



EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
12 janv. 2016 à 11:39
Le problème c'est que tu utilises du LOAD DATA.....
Ce qui implique en effet d'avoir les mêmes noms de colonnes dans tes fichiers CSV et dans tes tables.
Au contraire... pour ton cas, il faudrait gérer l'insertion en BDD toi même ....via des requêtes de INSERT.
cela te permettra de décider quelles colonnes de ton CSV vont dans quelles colonnes de ta BDD.....

En gros tu parcours ton fichier CSV via une boucle...
et pour chaque ligne ... tu fais un INSERT dans ta BDD.
0
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
Modifié par Amelie0528 le 14/01/2016 à 11:23
Bonjour jordane45 , en faite je tourne en rond depuis j'ai tout supprimer et je recommence a partir de la conception de la base de donné voila mon MCD(pièce joint) peut être c'est mieux expliquer la problématique par schéma: j'ai qu'une seul année 2015
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
14 janv. 2016 à 11:39
Bonjour,

Pour ce qui est du MCD .. je verrais bien qq chose de ce genre :



Comme tu peux le voir, j'ai ajouté une table fichier_import (ce qui te permettra d'avoir un historique pour savoir de quel fichier provient chaque ligne de ta table "factures")

Une fois ta BDD mise en place, il faut que tu codes le script d'import de tes fichiers...

Donc... voici l'algorithme que tu vas devoir mettre en place :
1 - Faire une boucle sur chaque fichier CSV que tu dois importer
2 - Pour chaque fichier ... faire une boucle qui va lire chaque ligne
3 - Pour chacune des lignes... (via un SPLIT) récupérer le contenu de chacune des colonnes
pour pouvoir ensuite, via une instruction INSERT (en sql) .. faire l'insertion en BDD...

=> Je te laisse écrire le code.
Reviens me voir (avec le code ! ) si tu rencontres des soucis.

Toutes les infos ( comment faire une boucle... comment lire un fichier ligne par ligne... etc... sont disponibles sur le net. )





0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
14 janv. 2016 à 11:40
petite erreur dans l'image que j'ai mise ...
la relation entre la table "factures" et client se fait sur le champ id_client (de la table factures)
0
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
14 janv. 2016 à 12:02
si j'ai bien compris id-client va être une clé étranger venant de la table client, si c'est le cas aprés je peut pas importer mes donnes csv parce qu'il ya une clé étrangère dedans.
En plus dans mes fichiers csv j'ai pas un champ date , donc je dois l'ajouter et il va etre une clé etranger aussi !!!
c'est ce qe j'ai fais au début mais ça marchais pas
en tout cas merci beaucoup de votre aide
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
14 janv. 2016 à 13:19

En plus dans mes fichiers csv j'ai pas un champ date , donc je dois l'ajouter et il va etre une clé etranger aussi !!!

Hein ?
La date ... tu l'as par rapport au nom du fichier .... c'est donc cette date là que tu dois insérer dans ta table.
Il n'y a aucune clé étrangère pour ça.

Pour ce qui est des clients .... si tes fichiers csv contiennent seulement le nom ... ben tu retires la table client et tu stockes directement le nom dans ta table factures....
Et au final .. tu ne conserves "que" la table factures (et la table fichiers)
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
14 janv. 2016 à 13:20
et encore.... la table fichiers c'était un plus pour garder l'historique des fichiers importés ..... tu peux t'en passer.
Je ne comprend vraiment pas où se trouve la difficulté dans ce que tu as à faire ....
0
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016 > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
14 janv. 2016 à 14:21
justement la date je l'ai par apport au nom de dossier, en fin c'est pas vraiment une date mais c'est le mois ou la facture est delivré (janvier, fevrier,.....)
j'ai comme donnée 12 dossier les noms des dossier sont respectivement(janvier, février, ....décembre), et à l'interieur de chaque dossier il ya des fichisers csv, chaque fichier csv porte le nom du client, et a l’intérieur du fichier csv il ya pas d'informations qui peut etre une clé primaire. je vous ait envoyé un aperçu du csv en MP,
c'est tellement flou que je perd l'espoir
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
14 janv. 2016 à 14:37


peut être avec cette image vous verrez plus ce que je veut dire
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
14 janv. 2016 à 14:40
Et bien... il y a déjà une colonne ID ... don c'est niquel...
tu n'as même pas besoin de t'en occuper....


Tu as le nom du client (dans le nom du document) ... la date (du moins le mois ) dans le nom du dossier )
Et tu connais l'année (puisque c'est 2015)...
Donc tu as toutes les infos nécéssaires pour charger ta table !

Je ne comprends toujours pas où se trouve la dfficulté !
0
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016 > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
14 janv. 2016 à 14:48
donc il ya une seul table qui comporte tout les champs du csv + champ date(mois) + champs nom client ??????
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
14 janv. 2016 à 15:06
Ben oui
Au final .. je ne vois que ça.
Après tu pourrais complexifier en mettant une table CLIENT à part ....
Puis, lors de la requête d'insertion.. aller chercher l' ID du client dans cette table si il existe .... sinon... l'ajouter à ta table client PUIS récupérer son ID.
0
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
14 janv. 2016 à 15:13


j'ai mis le tout dans une même table, c'est normale si c'est comme ca ma table!!!
excuse moi si je pose trop de question, c'est que j'ai personne autour a qui demandé dans mon stage
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
14 janv. 2016 à 15:29
Ca me semble correct comme ça.
0
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
14 janv. 2016 à 15:30
merci beaucoup pour votre assistance, c'est rassurant pour moi
0
merci pour votre réponse, c'est gentil
.. mais de cette façon je vais avoir une base de données avec une seule table !!!!!!!!!!
les fichiers cvs possèdent tous les mêmes champs(id, nom, date, age, .....)
en tout j'ai environ 200 csv , regroupé par mois , exemple moi de janvier j'ai 20 fichier csv, moi de février aussi 20 csv, .....
!!!!!
je tourne en rond
-1
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
7 janv. 2016 à 10:49
Regardes si des choses sont communes .... et peuvent être isolées dans une table à part...
Par exemple... si tu as un champ "catégories" .... ça peut faire l'objet d'une table à part ....
et dans ta table principale faire un "lien" entre ces deux tables en te servant de L'ID ....
Mais bon... sans connaitre le contenu des fichiers ( ne serait-ce que les libellé des colonnes)... IMPOSSIBLE pour nous de t'en dire plus !
Ce n'est QUE de la réflexion... à toi de t'y coller.
Et si vraiment il n'y a qu'une seule Table... et ben ok.... pourquoi pas. ça arrive (souvent...)
0
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
7 janv. 2016 à 16:07
merci de votre réponse , j'ai fait 3 table séparé ( Fournisseur, facture, période), j'ai créer des relations , j'ai fait le MCD avec AnayseSI puis il m'a générer du SQL mais il affiche des erreurs quand je l'exécute sous mysql , donc j'ai laissé tombé.
Maintenant je suis entrain de crée manuellement les tables mais pareil aussi message d'erreur au moment de la création de la table #1060 - Duplicate column name 'Value',
effectivement j'ai deux colonnes qui s'appellent Value mais le deuxième a un 'v' minuscule, donc normalement c'est pas pareil mais MySQL considère que c'est la même chose .
El le problème est que je peut pas changer le nom de la colonne parce que après je doit importer 200 csv dont les champs doit être les mêmes que ceux de la table, si non les champs vont pas se correspondent au cours de l'importation .!!!!!!!
j'avance comme une tortue mais toujours je démarre pas
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
7 janv. 2016 à 16:45
Par ce que ton import ... tu vas devoir le SCRIPTER et pas suelement faire du LOAD data dans ta table !
Donc oui.. il faut mettre des NOMS différents dans tes noms de champs de ta BDD
Et oui.. tu vas devoir coder un script (en php par exemple) pour charger les données de tes CSV dans tes tables).

Mais bon... tu ne peux pas dire que tu ne démarre pas.... tu as déjà concu le MCD et commencé à créer tes tables....
0
Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
7 janv. 2016 à 16:55
oui , je vois ce que vous voulez dire, sauf que les fichier csv en les reçois via un API d'une entreprise partenaire donc je peu dois garder les noms des champs si non ils seront obliger de changer beaucoup d'autres choses comme il m'expliqué un collègue tout a l'heure, il fallait absolument que je garde les mêmes noms des champs des fichier csv!!!!
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > Amelie0528 Messages postés 51 Date d'inscription dimanche 2 novembre 2014 Statut Membre Dernière intervention 22 février 2016
7 janv. 2016 à 17:46
Le nom des champs dans les tables .... seul le DÉVELOPPEUR doit s'en préoccuper ..... pas les UTILISATEURS !
Tu peux écrire TOTO TITI TATA dans ta BDD .... peu importe .....!
Je ne vois pas pourquoi les utilisateurs seraient obligés de changer quoi que ce soit .......
eux.. te fournissent des fichiers csv ( avec des noms de colonnes..... ok....)
Toi... via un SCRIPT que TU auras développé... tu récupères le contenu de ces fichiers et tu les stockes dans TA BDD ( en faisant correspondre les colonnes des fichiers csv... avec les bonnes "colonnes" de tes tables (peu importe le nom que tu leur aura donné)..

Est-ce assez clair pour toi maintenant ???
0