Bonjour,
On essaye d'importer dans une base de données, le contenu d'un fichier .csv , comment faire pour éviter d'importer des entrées similaires ?
sachant que le fichier csv contient un unique numéro qu'on peut utiliser.
Merci
Bonjour,
On essaye d'importer dans une base de données, le contenu d'un fichier .csv , comment faire pour éviter d'importer des entrées similaires ?
sachant que le fichier csv contient un unique numéro qu'on peut utiliser.
Merci
Comme je l'ai dit dans cette autre réponse que je t'ai faite hier soir :
Il va vraiment falloir que je l'écrive cet article sur l'importation des données de fichiers csv !D'une manière générale d'ailleurs, il vaut mieux importer le fichier CSV dans une table temporaire puis répartir les données comme il se doit dans une BDD structurée et normalisée avec les bons types de colonnes.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
tu as tout à fait raison CinePhil, en attendant l'article , est ce que c'est possible de m'aider ?
Si tu expliques mieux ton besoin, oui.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
l'ajout du contenu d'un fichier csv à la base de donnée , sans avoir de double , parcequ'on compte utiliser cronjob pour effectuer automatiquement l'opération.
exemple du csv:
il nous faut un moyen pour n'ajouter que les nouveaux entrées en se basant sur le code unique."header1","header2","header3","tite_du_code_unique","header4","header5"
"text1" ,"text2" ,"text3" ,"code" ,"text4" ,"text5"
"text11" ,"text12" ,"text13" ,"code1" ,"text14" ,"text15"
Merci
Tu veux ajouter des données dans une table existante en évitant de ré-insérer les lignes dont le code existe déjà dans la table ?
Doc MySQL :
Les mots réservés REPLACE et IGNORE contrôlent la méthode d'insertion de lignes lorsque des doublons apparaissent pour les clés uniques.
Si vous spécifiez REPLACE, les nouvelles lignes remplaceront les anciennes. See Section 13.1.6, « Syntaxe de REPLACE ».
Si vous spécifiez IGNORE, les nouvelles lignes seront ignorées. Si vous ne spécifiez pas cette option, une erreur sera générée à chaque doublon, et le reste du fichier sera ignoré.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
oui c'est cela.
Comme j'ai édité mon précédent message pendant ta réponse, regarde ce que j'ai ajouté, cela te suffira peut-être.
Sinon, comme je le préconise, importe le fichier csv dans une nouvelle table temporaire puis importe les données utiles dans la vraie table.
Tu auras peut être besoin d'isoler les codes uniques existant dans une table temporaire car MySQL n'aime pas que la table en cours de modif soit dans une sous-requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 INSERT INTO la_vraie_table (les_colonnes) SELECT les_colonnes_correspondantes -- éventuellement avec des opérations de conversion vers les bons types de données FROM la_table_temporaire WHERE le_code_unique NOT IN( SELECT le_code_unique FROM la_vraie_table )
Ça fait longtemps que je n'ai plus fait ça alors je ne me souviens plus de la méthode exacte mais c'est l'idée. Je peaufinerai ça quand j'écrirai mon article.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Pourquoi ne pas simplement mettre une contrainte d'unicité sur le code en question et déverser les données dans la table ? Les lignes violant la contrainte d'unicité ne seront pas ajoutées.
(Trop) simple mais ça devrait répondre au besoin.
Oui, c'est ce que je suggérais avec l'encadré issu de la doc MySQL.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
oui mais comment réaliser la contrainte d'unicité sur le code ?
j'utilise ce fichier pour ajouter le contenu csv à la base de donnée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 <?php /********************************/ /* Code at http://legend.ws/blog/tips-tricks/csv-php-mysql-import/ /* Edit the entries below to reflect the appropriate values /********************************/ $databasehost = ""; $databasename = ""; $databasetable = "data"; $databaseusername =""; $databasepassword = ""; $fieldseparator = ","; $lineseparator = "\n"; $csvfile = "data.csv"; /********************************/ /* Would you like to add an ampty field at the beginning of these records? /* This is useful if you have a table with the first field being an auto_increment integer /* and the csv file does not have such as empty field before the records. /* Set 1 for yes and 0 for no. ATTENTION: don't set to 1 if you are not sure. /* This can dump data in the wrong fields if this extra field does not exist in the table /********************************/ $addauto = 0; /********************************/ /* Would you like to save the mysql queries in a file? If yes set $save to 1. /* Permission on the file should be set to 777. Either upload a sample file through ftp and /* change the permissions, or execute at the prompt: touch output.sql && chmod 777 output.sql /********************************/ $save = 1; $outputfile = "data.sql"; /********************************/ if(!file_exists($csvfile)) { echo "File not found. Make sure you specified the correct path.\n"; exit; } $file = fopen($csvfile,"r"); if(!$file) { echo "Error opening data file.\n"; exit; } $size = filesize($csvfile); if(!$size) { echo "File is empty.\n"; exit; } $csvcontent = fread($file,$size); fclose($file); $con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error()); @mysql_select_db($databasename) or die(mysql_error()); $lines = 0; $queries = ""; $linearray = array(); foreach(split($lineseparator,$csvcontent) as $line) { $lines++; $line = trim($line," \t"); $line = str_replace("\r","",$line); /************************************ This line escapes the special character. remove it if entries are already escaped in the csv file ************************************/ $line = str_replace("'","\'",$line); /*************************************/ $linearray = explode($fieldseparator,$line); $linemysql = implode(",",$linearray); if( $lines > 1) { if($addauto) $query = "insert into $databasetable values('','$linemysql');"; else $query = "insert into $databasetable values($linemysql);"; $queries .= $query . "\n"; @mysql_query($query); } } @mysql_close($con); if($save) { /*if(!is_writable($outputfile)) { echo "File is not writable, check permissions.\n"; } else {*/ $file2 = fopen($outputfile,"w"); if(!$file2) { echo "Error writing to the output file.\n"; } else { fwrite($file2,$queries); fclose($file2); } //} } echo "Found a total of $lines records in this csv file.\n"; ?>
Je croyais que tu utilisais simplement LOAD DATA INFILE pour importer le fichier csv !
La contrainte d'unicité se pose sur la table dans MySQL par l'ajout d'un index de type UNIQUE, à moins que celui n'existe déjà.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
j'ai essayé de recréer la table en ajoutant
UNIQUE code
mais ça marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CREATE TABLE IF NOT EXISTS `data` ( `header1` text NOT NULL, `header2` text NOT NULL, `header3` text NOT NULL, `tite_du_code_unique` text NOT NULL, `header4` text NOT NULL, `header5` text NOT NULL UNIQUE (tite_du_code_unique) ) ENGINE=MyISAM;
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
aucune idée
je crois que je vais essayer distinct dans select.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager