Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 292 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
11 jpm 1
<?php
2
 
3
// commande : /opt/lampp/bin/php cli.php description_sp -a tester -n /home/jennifer/Tela-botanica_projets/Coste/descriptions/html
4
 
5
class DescriptionSp extends Script {
6
 
7
	protected $donnees = array();
8
	protected $nb_espece = 0;
9
	protected $donnees_espece = array();
10
	protected $fichier;
11
	protected $table_espece = array();
12
 
13
	protected $parametres_autorises = array(
14
		'-n' => array(true, null, 'nom du dossier à analyser'));
15
 
16
	public function executer() {
17
		$this->bdd = new Bdd();
18
 
19
		// Lancement de l'action demandée
20
		$cmd = $this->getParametre('a');
21
		switch ($cmd) {
22
			case 'integrer' :
426 jpm 23
				$this->supprimerPagesExistantes();
24
				$this->reinitialiserAutoIncrement('coste_pages');
25
				$this->reinitialiserAutoIncrement('coste_triples');
26
 
11 jpm 27
				$this->ouvrirDossier();
28
				$this->chargerIndexGpFG();
29
				$this->integrerSynonyme();
30
				ksort($this->table_espece);
31
				$this->recupererDonneesBdnff();
32
				$this->genererNumNom();
33
				$this->insererNumNomDansTriples();
34
				$this->creerTableCoste();
35
				$this->insererTableProjetCoste();
36
				break;
37
			default :
38
				$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
39
		}
40
	}
41
 
42
//---------------------------------FONCTION DE RECUPERATION DES DONNEES SUR LES ESPECES---------------------------------
43
 
44
	private function ouvrirDossier() {
45
		$nomDossier = $this->getParametre('n');
46
		$tableaux = null;
47
		if (file_exists($nomDossier) === true) {
48
			if (is_dir($nomDossier)) {
49
				if ($dossierOuvert = opendir($nomDossier) ) {
50
					while ( ($nomFichier = readdir($dossierOuvert)) !== false) {
51
						if ( !is_dir($nomFichier) && preg_match('/e[0-9]{4}\.htm/', $nomFichier)) {
52
							$nomFichier = $nomDossier.'/'.$nomFichier;
53
							$this->traiterFichier($nomFichier);
54
						}
55
					}
56
					closedir($dossierOuvert);
57
				} else {
58
					$this->traiterErreur("Le dossier $nomDossier n'a pas pu être ouvert.");
59
				}
60
			} else {
61
				$tableaux[$nomDossier] = $this->ouvrirFichier($nomDossier);
62
			}
63
		} else {
64
			$this->traiterErreur("Le dossier $nomDossier est introuvable.");
65
		}
66
		$this->traiterInfo('Nombre d\'espèce : '.$this->nb_espece);
67
		//$this->creerFichier('donneesEspeces.tsv', $this->donnees_espece, '/home/jennifer/Tela-botanica_projets/Coste/descriptions/');
68
		return $tableaux;
69
	}
70
 
71
	private function supprimerPagesExistantes() {
72
		//suppression des tuples déjà existants
73
		$requete = 'DELETE FROM coste_pages WHERE id > 35';
74
		$this->bdd->requeter($requete);
75
		$requete = 'DELETE FROM coste_triples WHERE id > 1';
76
		$this->bdd->requeter($requete);
77
		$requete = 'DELETE FROM coste_correspondance_bdnff ';
78
		$this->bdd->requeter($requete);
79
		$this->traiterInfo('Table coste_pages, coste_triple et coste_correspondance_bdnff ont été vidés :)');
80
	}
81
 
82
 
83
	private function reinitialiserAutoIncrement($table) {
292 jpm 84
		$requete_max_id = 'SELECT max(id) FROM '.$table;
11 jpm 85
		$id_max = $this->bdd->recuperer($requete_max_id);
86
		$id_max = $id_max['max(id)'];
87
		$id_max = $id_max+1;
88
		$requete_pages = 'ALTER TABLE '.$table.' AUTO_INCREMENT = '.$id_max;
89
		$this->bdd->requeter($requete_pages);
90
	}
91
 
92
 
93
	private function traiterFichier($nomFichier) {
94
		$donnees = $this->ouvrirFichier($nomFichier);
95
		if ($donnees['ouvert'] == "oui") {
96
			$donneesTag = $this->creerNomPage($donnees['tag']);
97
			//on insère le triple titre dans coste_triples
98
			$this->donnees_espece[] = $donneesTag;
99
			$requetePage = 'INSERT INTO coste_pages (tag, time, body, latest) VALUES ("'
100
							.$donneesTag['nomPage'].'", NOW(), "'.$donnees['texte'].'", "Y");';
101
			$requeteTriple = 'INSERT INTO coste_triples(resource, property, value) VALUES '
102
							.'("'.$donneesTag['nomPage'].'", "titre", "'.$donneesTag['titre'].'"),';
103
			//on insère les correspondances avec bdnff
104
			$donneesCorr = $this->creerCorrespondance($donnees['correspondance']);
105
			$requeteCorr = 'INSERT INTO coste_correspondance_bdnff VALUES ("'
106
							.$donneesTag['id'].'", "'.$donneesCorr['num_nom'].'", "'
107
							.$donneesCorr['num_tax'].'", "'.$donneesCorr['famille'].'", "'.$donneesCorr['nom_sci'].'");';
108
			$requete = $requetePage." ".rtrim($requeteTriple, ',')."; ".$requeteCorr;
109
			$this->bdd->requeter($requete);
110
 
111
			$this->nb_espece++;
112
			$this->afficherAvancement("insertion espece");
113
		}
114
	}
115
 
116
	private function ouvrirFichier($nomFichier) {
117
		$this->fichier = $nomFichier;
118
		$donnees = null;
119
		if (file_exists($nomFichier) === true && preg_match('/e[0-9]{4}.htm$/', $nomFichier)) {
120
			if ( $fichierOuvert = fopen($nomFichier, 'r') ) {
121
				$donnees['ouvert'] = "oui";
122
				$i = 1;
123
				while ($ligne = fgets($fichierOuvert)) {
124
					if ($i == 24) {
125
						$donnees['tag'] = $this->traiterHtml($ligne);
126
					} elseif ($i == 45) {
127
						$donnees['texte'] = $this->traiterHtml($ligne, $au = true);
128
						$this->donnees['texte'] = $this->traiterHtml($ligne);
129
					} elseif ($i == 46 || $i == 47) {
130
						$donnees['texte'] .= $this->traiterHtml($ligne);
131
					} elseif ($i == 63 || preg_match('/Bdnff /ui', $ligne)) {
132
						$donnees['correspondance'] = $this->traiterHtml($ligne);
133
					}
134
					$i++;
135
				}
136
				fclose($fichierOuvert);
137
			} else {
138
				$this->traiterErreur("Le fichier $nomFichier n'a pas pu être ouvert.");
139
			}
140
		} else {
141
			$this->traiterErreur("Le fichier $nomFichier est introuvable.");
142
		}
143
		return $donnees;
144
	}
145
 
146
 
147
	private function traiterHtml($donnees, $au = null) {
148
		$donnees_traitees = strip_tags($donnees,'<B>,<I>');
149
		$donnees_traitees = html_entity_decode($donnees_traitees, ENT_NOQUOTES, 'UTF-8');
150
		$donnees_traitees = str_replace('<B>', '**', $donnees_traitees);
151
		$donnees_traitees = str_replace('</B>', '**', $donnees_traitees);
152
		$donnees_traitees = str_replace('<I>', '//', $donnees_traitees);
153
		$donnees_traitees = str_replace('</I>', '//', $donnees_traitees);
154
		$donnees_traitees = trim($donnees_traitees);
155
		if ($au) {
156
			$donnees_traitees = str_replace('&#173;', '', $donnees_traitees);
157
		}
158
		return $donnees_traitees;
159
	}
160
 
161
 
162
	private function creerNomPage($tag) {
163
	 	$partiesTag = explode(' - ', $tag);
164
		preg_match('/(C.*)/', $tag, $titre);
165
		$donnees['titre'] = $titre[0];
166
 
167
		list($num, $donnees['id']) = explode(' ', trim($partiesTag[0]));
168
		list($num, $donnees['num_nom_coste'] )	=  explode(' ', trim($partiesTag[0]));
169
 		$donnees['nom_sci'] = trim($partiesTag[1]);
170
		$partiesNomSci = explode(' ', $donnees['nom_sci']);
171
 
172
		list($numFamille, $donnees['famille']) = explode(', ', trim($partiesTag[2]));
173
		list($num, $tomePage) = explode(',', trim($partiesTag[3]));
174
 
175
	 	if (preg_match('/T(\d*)\.p(\d*)/', $tomePage, $match)){
176
  			$donnees['tome'] = $match[1];
177
	 		$donnees['page'] = sprintf("%04d",$match[2]);
178
	 	}
179
	 	$donnees['nomPage'] = 'DscCoste1937T'.$donnees['tome'].'P'.$donnees['page'].implode(array_map('ucfirst',$partiesNomSci));
180
		if ($donnees['nomPage'] == 'DscCoste1937TP') echo 'MERDE!!!!!!!!!!!! à la page '.$this->fichier;
181
	 	$partieNumTaxSupFamille = explode(',', $partiesTag[2]);
182
	 	$partieNumTaxSupGenre = explode(',', $partiesTag[3]);
183
		$donnees['num_tax_sup_genre'] = trim($partieNumTaxSupGenre[0]);
184
		//on recupère les auteurs, synonymes et nom_vernaculaires
185
		$this->recupererInfosComplementaires($donnees);
186
		return $donnees;
187
	}
188
 
189
 
190
	private function recupererInfosComplementaires(&$donnees) {
191
	 	$this->donnees['texte'] = str_replace('­', '', $this->donnees['texte']); //on enlève un petit tiret présent entre la plupart des mots (non visible ici)
192
		preg_match('/^ {0,1}[*]{2}([^*]+)[*]{2} ([^–(\/]+\.?)?\s*(?:[(]([^)]+)[)])?[ –.]*(?:[\/]{2}([^\/]+)\s*–\s*[\/]{2})?/', $this->donnees['texte'], $match2);
193
 
194
		$annee = '';
195
		if ($match2 == array()) echo "donnees du fichier : $this->fichier";
196
		if (isset($match2[1]) && strrpos($match2[1], ' subsp. ') !== false) {
197
			$donnees['nom_sci'] = preg_replace(array('/ All./', '/ L./','/^\s*[0-9]{4}[ –.]*/'), '', $match2[1]);
198
		}
199
		$auteur = (isset($match2[2])) ? $match2[2] : '';
200
		$synonyme = (isset($match2[3])) ? $match2[3] : '';
201
		$nom_verna = (isset($match2[4])) ? $match2[4] : '';
202
		if (preg_match('/^\s*[1-9]{4}\s*$/', $synonyme)) {
203
			$annee = $synonyme;
204
			$synonyme = '';
205
		} elseif (preg_match('/.*?([0-9]{4})/', $auteur, $annee_match) && !preg_match('/ in /', $annee_match[1])) {
206
			$annee = $annee_match[1];
207
			$auteur = preg_replace('/ [0-9]{4}/', '', $auteur);
208
		}
209
		$donnees['annee'] = $annee;
210
		$donnees['auteur'] = $auteur;
211
		$donnees['synonyme'] = $synonyme;
212
		$donnees['nom_vernaculaire'] = $nom_verna;
213
		$this->insererDansTableEspece($donnees);
214
	}
215
 
216
 
217
	private function insererDansTableEspece($donnees) {
218
		$this->table_espece[$donnees['num_nom_coste']] = array(
219
														'tag' => $donnees['nomPage'],
220
														'num_nom_retenu_coste' => $donnees['num_nom_coste'],
221
														'num_nom_coste' => $donnees['num_nom_coste'],
222
														'num_tax_sup_genre' => $donnees['num_tax_sup_genre'],
223
														'rang' => 290,
224
														'nom_sci' => $donnees['nom_sci'],
225
														'auteur' => $donnees['auteur'],
226
														'nom_vernaculaire' => $donnees['nom_vernaculaire'],
227
														'nom_coste' => $donnees['nom_sci'],
228
														'tome' => $donnees['tome'],
229
														'annee' => $donnees['annee'],
230
														'synonyme' => $donnees['synonyme']);
231
	}
232
 
233
 
234
	private function creerCorrespondance($correspondance) {
235
		$parties = explode('-', $correspondance);
236
		if (isset($parties[1])) {
237
			list($num, $donnees['num_nom']) = explode(' ', trim($parties[0]));
238
			$donnees['nom_sci'] = trim($parties[1]);
239
			$donnees['famille'] = trim($parties[2]);
240
			list($num, $num_tax) = explode('=', trim($parties[3]));
241
			$donnees['num_tax'] = ($num_tax == "") ? 'NULL' : $num_tax;
242
		} else {
243
			$donnees['num_nom'] = 'NULL';
244
			$donnees['nom_sci'] = 'NULL';
245
			$donnees['famille'] = 'NULL';
246
			$donnees['num_tax'] = 'NULL';
247
		}
248
		return $donnees;
249
	}
250
 
251
//---------------------------------------FONCTION DE CREATION DE LA TABLE COSTE------------------------------------------
252
 
253
	private function chargerIndexGpFG() {
254
		$requete = 	'SELECT * FROM coste_index_general ';
255
		$resultat = $this->bdd->recupererTous($requete);
256
		foreach ($resultat as $nom) {
257
			$nom_coste = ($nom['nom_coste'] == '') ? $this->transliterer($nom['nom_sci']) : $this->transliterer($nom['nom_coste']);
258
			$nom_sci = $this->transliterer($nom['nom_sci']);
259
			$tome = $nom['tome'];
260
			$page = $nom['page'];
261
			$num_tax_sup_coste = $nom['num_tax_sup_coste'];
262
			$num_nom_coste = $nom['num_nom_coste'];
263
			$rang = $nom['rang'];
264
			$this->indexGpFG[$num_nom_coste] = array('nom_sci' => $nom_sci,
265
													'rang' => $rang,
266
													'nom_coste' => $nom_coste,
267
													'num_nom_coste' => $num_nom_coste,
268
													'num_tax_sup_coste' => $num_tax_sup_coste,
269
													'tome' => $tome,
270
													'page' => $page);
271
		}
272
	}
273
 
274
 
275
	private function transliterer($txt) {
276
		$txt = ucwords(strtolower(Chaine::supprimerAccents($txt)));
277
		return trim($txt);
278
	}
279
 
280
 
281
	private function integrerSynonyme() {
282
		foreach ($this->table_espece as $num_nom_coste => $donnees) {
283
			$et = false; //cas où on a "syno et syno L."
284
			$auteur = '';
285
			$genre_syn = '';
286
			if ($donnees['synonyme'] != '') {
287
				$donnees['synonyme'] = preg_replace(array('/^t\s{1}/','/^et\s{1}/', '/^avec /', '/, etc\.$/', '/\//', '/­/'), '', $donnees['synonyme']);
288
				if (strrpos($donnees['synonyme'], ';') === false
289
				&& preg_match('/^[A-Z][^ ]+ [^ ]+(?: ([^,;]+))?\s*[.]?(et|,)[ ]?[A-Z]{1}[^ on,]+ [^., ]+[ ]+(?:.*)?$/', $donnees['synonyme'], $ponctu)) {
290
					if ($ponctu[2] == 'et') {
291
						$synonymes = array_reverse(explode($ponctu[2], $donnees['synonyme']));
292
						$et = true;
293
					} else {
294
						$synonymes = explode($ponctu[2], $donnees['synonyme']);
295
					}
296
				} else {
297
					$synonymes = explode(';', $donnees['synonyme']);
298
				}
299
				$num_syn = 0; //on numerote les synonyme avec comme num_nom_coste : num_nom_coste du retenu + ".1", ".2" , ...
300
				foreach ($synonymes as $nom_syn) {
301
					$annee = '';
302
					$notes = $this->recupererLesNotesDesSynonymes($nom_syn);
303
					$this->recupererAnneeSynonyme($nom_syn, $annee);
304
					if (preg_match('/^\s*([^ ]*) ([^ ]*)( (?:VAR\.|v\.) [^ ]+)?(?: (.*))?$/', $nom_syn, $match)) {
305
						$num_syn++;
306
						$nom_sci = $this->recupererNomSciComplet($match, $donnees, $num_syn, $genre_syn);
307
						$auteur_syn = $this->recupererAuteurSyn($match, $auteur, $et);
308
						$this->ajouterSynonymeALaTableEspece($donnees, $nom_sci, $auteur_syn, $annee, $notes, $num_syn);
309
					} else {
310
						$this->traiterErreur('Synonyme '.$nom_syn.' non reconnu par l\'expression régulière ');
311
					}
312
				}
313
			}
314
		}
315
	}
316
 
317
 
318
	private function recupererNomSciComplet(&$match, &$donnees, &$num_syn, &$genre_syn) {
319
		//on récupère le nom complet du genre dans les cas ou le genre est noté : A.
320
		//Attention à l'ex suivant : D. THUILLIERI G. G. ; AIRA SETACEA Huds.; A. DISCOLOR Thuil.; A. ULIGINOSA Weihe
321
		if ($num_syn == 1 && preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
322
			preg_match('/\s*([^ ]+) .+$/', $donnees['nom_sci'], $nom_genre);
323
			$match[1] = $nom_genre[1];
324
			$genre_syn = $nom_genre[1];
325
		} elseif (!preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
326
			$genre_syn = $match[1];
327
		} elseif ($num_syn != 1 && preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
328
			$match[1] = $genre_syn;
329
		}
330
		if (isset($match[3])) {
331
			$nom_sci = ucfirst(strtolower($match[1].' '.$match[2].str_replace('v. ', 'var. ', $match[3])));
332
		} else {
333
			$nom_sci = ucfirst(strtolower($match[1].' '.$match[2]));
334
		}
335
		return $nom_sci;
336
	}
337
 
338
 
339
	private function recupererAnneeSynonyme(&$nom_syn, &$annee) {
340
		if (preg_match('/ ([0-9]{4})\s*/', $nom_syn, $annee_match)) {
341
			$annee = $annee_match[1];
342
		}
343
	}
344
 
345
 
346
	private function recupererAuteurSyn(&$match, &$auteur, &$et) {
347
		//on recupere l'auteur ds une variable ds le cas ou : R. machin et R. truc auteur.
348
		if (isset($match[4]) && $match[4] != '' && $et) {
349
			$auteur = $match[4];
350
		}
351
		$auteur_syn = $auteur;
352
		if (isset($match[3]) && !$et) {
353
			$auteur_syn = preg_replace('/ [0-9]{4}/', '', $match[4]);
354
		} elseif ($auteur != '' && $et) {
355
			$auteur_syn = preg_replace('/ [0-9]{4}/', '', $auteur);
356
		}
357
		return $auteur_syn;
358
	}
359
 
360
	public function recupererLesNotesDesSynonymes(&$nom_syn) {
361
		// on recupère les notes
362
		if (preg_match('/^(ompr.|incl.) (.*)/i', $nom_syn, $note_abbr)) {
363
			$notes = ($note_abbr[1] == 'ompr.') ? 'compr.' : 'incl.';
364
			$nom_syn = $note_abbr[2];
365
		} else {
366
			$notes = '';
367
		}
368
		return $notes;
369
	}
370
 
371
	public function ajouterSynonymeALaTableEspece($donnees, $nom_sci, $auteur_syn, $annee, $notes, $num_syn) {
372
		$num_nom_coste_syn = $donnees['num_nom_coste'].'.'.$num_syn;
373
		$this->table_espece[$num_nom_coste_syn] = array(
374
												'num_nom_coste' => $donnees['num_nom_coste'].'.'.$num_syn,
375
												'num_nom_retenu_coste' => $donnees['num_nom_coste'],
376
												'num_tax_sup_genre' => $donnees['num_tax_sup_genre'],
377
												'rang' => 290,
378
												'nom_sci' => $nom_sci,
379
												'auteur' => $auteur_syn,
380
												'nom_vernaculaire' => '',
381
												'nom_coste' => $nom_sci,
382
												'tome' => $donnees['tome'],
383
												'annee' => $annee,
384
												'flore_bdnff_num' => '',
385
												'flore_bdnff_nom_sci' => '',
386
												'notes' => $notes);
387
	}
388
 
389
	private function recupererDonneesBdnff() {
390
		$req = "SELECT * FROM coste_correspondance_bdnff";
391
		$res = $this->bdd->recupererTous($req);
392
		$total = 0;
393
		if ($res) {
394
			foreach ($res as $espece_bdnff) {
395
				$num_nom_coste = $espece_bdnff['id'];
396
				if (isset($this->table_espece[$num_nom_coste])) {
397
					$this->table_espece[$num_nom_coste]['flore_bdnff_num'] = $espece_bdnff['num_nom'];
398
					$this->table_espece[$num_nom_coste]['flore_bdnff_num_tax'] = $espece_bdnff['num_tax'];
399
					$this->table_espece[$num_nom_coste]['flore_bdnff_nom_sci'] = $espece_bdnff['nom_sci'];
400
					$total++;
401
				} else {
402
					$e = "Le num_nom_coste $num_nom_coste de la table de correspondance bdnff n'exsite pas dans la table donneesEspece ";
403
					$this->traiterErreur($e);
404
				}
405
			}
406
		} else {
407
			$this->traiterErreur('recupererDonneesBdnff() : mauvaise requete');
408
		}
409
		if ($total != 0) {
410
			$this->traiterInfo('Donnees de la bdnff recuperées pour les especes. Total bdnff = '.$total.'\n');
411
		}
412
	}
413
 
414
 
415
	private function genererNumNom() {
416
		$this->table_num_nom = array();
417
		$num_nom = 1;
418
		foreach($this->indexGpFG as $donneesCle) {
419
			$this->table_num_nom[$num_nom] = $donneesCle['num_nom_coste'];
420
			$this->indexGpFG[$donneesCle['num_nom_coste']]['num_nom'] = $num_nom;
421
			$num_nom++;
422
			if (preg_match('/^G[0-9]+/',$donneesCle['num_nom_coste'])) {
423
				foreach ($this->table_espece as $donneesEspece) {
424
					if ($donneesEspece['num_tax_sup_genre'] == $donneesCle['num_nom_coste']) {
425
						$this->table_num_nom[$num_nom] = $donneesEspece['num_nom_coste'];
426
						$this->table_espece[$donneesEspece['num_nom_coste']]['num_nom'] = $num_nom;
427
						$num_nom++;
428
					}
429
				}
430
			}
431
		}
432
		if ($this->table_num_nom != array()) $this->traiterInfo('Num_nom generer. Total num_nom = '.count($this->table_num_nom));
433
		else $this->traiterErreur( 'erreur dans la génération des num_nom\n');
434
	}
435
 
436
 
437
	private function insererNumNomDansTriples() {
438
		$table_triples = array();
439
		foreach ($this->table_espece as $num_nom_coste => $donnees) {
440
			if (isset($donnees['synonyme'])) {
441
				$table_triples[] = array('resource' => $donnees['tag'], 'property' => 'num_nom', 'value' => $donnees['num_nom']);
442
			}
443
		}
444
		$this->suppressionTriplesExistants();
445
		$this->reinitialiserAutoIncrement('coste_triples');
446
		//insertion des triples num_nom en une seule requete
447
		foreach ($table_triples as $triple) {
448
			$resource = $this->bdd->proteger($triple['resource']);
449
			$property = $this->bdd->proteger($triple['property']);
450
			$value = $this->bdd->proteger($triple['value']);
451
			$requete = "INSERT INTO coste_triples (resource, property, value) VALUES ($resource,$property ,$value)";
452
			$res = $this->bdd->requeter($requete);
453
			if ($res) {
454
				$this->afficherAvancement('Insertion des triples existants');
455
			} else {
456
				$this->afficherAvancement('Erreur de insertion des triples existants');
457
			}
458
		}
459
	}
460
 
461
	private function suppressionTriplesExistants() {
462
		$requete = 'DELETE FROM coste_triples '.
463
				'WHERE property = "num_nom"'.
464
				'AND resource IN ("'.implode(array_keys($this->table_espece), '","').'")';
465
		$res = $this->bdd->requeter($requete);
466
		if ($res == '') {
467
			$this->traiterErreur('Suppression des triples existants : aucun existant');
468
		} elseif ($res) {
469
			$this->traiterInfo('Suppression des triples existants');
470
		} else {
471
			$this->traiterErreur('Erreur de suppression des triples existants');
472
		}
473
	}
474
 
475
	private function creerTableCoste() {
476
		$this->insererGpFG();
477
		$this->insererEspeces();
478
		ksort($this->table_projet);
479
	}
480
 
481
	private function insererGpFG() {
482
		$total = 0;
483
		foreach ($this->indexGpFG as $donneesGpFG) {
484
			$num_nom = $donneesGpFG['num_nom'];
485
			$num_nom_retenu = $donneesGpFG['num_nom'];
486
			$num_tax_sup = array_search($donneesGpFG['num_tax_sup_coste'], $this->table_num_nom);
487
			$annee = '';
488
			$nom_sci = $donneesGpFG['nom_sci'];
489
			$rang = $donneesGpFG['rang'];
490
			$nom_coste = $donneesGpFG['nom_coste'];
491
			$num_nom_coste = $donneesGpFG['num_nom_coste'];
492
			$tome = $donneesGpFG['tome'];
493
			$page = $donneesGpFG['page'];
494
			$genre = '';
495
			$nom_supra_generique = '';
496
			if ($rang != '220') {
497
				$nom_supra_generique = $nom_sci;
498
			} else {
499
				$genre = $nom_sci;
500
			}
501
 
502
			$this->table_projet[$num_nom] = array(
503
				'num_nom_retenu' => $num_nom_retenu,
504
				'num_tax_sup' => $num_tax_sup,
505
				'rang' => $rang,
506
				'nom_sci' => $nom_sci,
507
				'nom_supra_generique' => $nom_supra_generique,
508
				'genre' => $genre,
509
				'epithete_infra_generique' => '',
510
				'epithete_sp' => '',
511
				'type_epithete' => '',
512
				'epithete_infra_sp' => '',
513
				'cultivar_groupe' => '',
514
				'cultivar' => '',
515
				'nom_commercial' => '',
516
				'auteur' => '',
517
				'annee' => '',
518
				'biblio_origine' => '',
519
				'notes' => '',
520
				'nom_adenddum' => '',
521
				'basionyme' => '',
522
				'nom_francais' => '',
523
				'nom_coste' => $nom_coste,
524
				'num_nom_coste' => $num_nom_coste,
525
				'tome' => $tome,
526
				'page' => $page,
527
				'flore_bdnff_num' => '',
528
				'flore_bdnff_nom_sci' => '',
529
				'nom_sci_html' => ''
530
			);
531
			$total++;
532
		}
533
		$this->traiterInfo('Donnees ajoutées à la table pour les groupes, familles et genres. Total donnees = '.$total.'\n');
534
	}
535
 
536
 
537
	private function insererEspeces() {
538
		$total = 0;
539
		foreach ($this->table_espece as $donnees) {
540
			$num_nom = $donnees['num_nom'];
541
			if (isset($donnees['num_nom_retenu_coste'])) {
542
				$num_nom_retenu = array_search($donnees['num_nom_retenu_coste'], $this->table_num_nom); //on recupere le num_nom à partir du num_nom_coste
543
			} else {
544
				$num_nom_retenu = $donnees['num_nom'];
545
			}
546
			$num_tax_sup = array_search($donnees['num_tax_sup_genre'], $this->table_num_nom); //on recupere le num_nom à partir du num_nom_coste
547
			$nom_sci = $donnees['nom_sci'];
548
			$rang = $donnees['rang'];
549
			$nom_coste = $donnees['nom_coste'];
550
			$num_nom_coste = (preg_match('/^([0-9]+)(?:\.[0-9]{1})?$/', $donnees['num_nom_coste'], $match)) ? $match[1] : $donnees['num_nom_coste'];
551
			$tome = $donnees['tome'];
552
			$auteur = $donnees['auteur'];
553
			$annee = $donnees['annee'];
554
			//$synonyme = $donnees['synonyme'];
555
			$nom_verna = $donnees['nom_vernaculaire'];
556
			$flore_bdnff_num = $donnees['flore_bdnff_num'];
557
			$flore_bdnff_nom_sci = $donnees['flore_bdnff_nom_sci'];
558
			$notes = (isset($donnees['notes'])) ? $donnees['notes'] : '';
559
			$genre = '';
560
			$epithete_sp = '';
561
			$type_epithete = '';
562
			$epithete_infra_sp = '';
563
			$biblio_origine = '';
564
			if ($num_nom_coste == '1988') $auteur = 'Coste';
565
			$this->traiterTypeEpithete($type_epithete, $nom_sci, $genre, $epithete_sp, $epithete_infra_sp);
566
			$this->traiterRefBiblio($auteur, $biblio_origine, $num_nom_coste);
567
 
568
			$this->table_projet[$num_nom] = array(
569
				'num_nom_retenu' => $num_nom_retenu,
570
				'num_tax_sup' => $num_tax_sup,
571
				'rang' => $rang,
572
				'nom_sci' => $nom_sci,
573
				'nom_supra_generique' => '',
574
				'genre' => $genre,
575
				'epithete_infra_generique' => '',
576
				'epithete_sp' => $epithete_sp,
577
				'type_epithete' => $type_epithete,
578
				'epithete_infra_sp' => $epithete_infra_sp,
579
				'cultivar_groupe' => '',
580
				'cultivar' => '',
581
				'nom_commercial' => '',
582
				'auteur' => $auteur,
583
				'annee' => $annee,
584
				'biblio_origine' => $biblio_origine,
585
				'notes' => $notes,
586
				'nom_adenddum' => '',
587
				'basionyme' => '',
588
				'nom_francais' => $nom_verna,
589
				'nom_coste' => $nom_coste,
590
				'num_nom_coste' => $num_nom_coste,
591
				'tome' => $tome,
592
				'page' => null,
593
				'flore_bdnff_num' => $flore_bdnff_num,
594
				'flore_bdnff_nom_sci' => $flore_bdnff_nom_sci,
595
				'nom_sci_html' => ''
596
			);
597
			$total++;
598
		}
599
		$this->traiterInfo('Donnees ajoutées à la table pour les especes. Total donnees = '.$total.'\n');
600
	}
601
 
602
 
603
	private function traiterRefBiblio(&$auteur, &$biblio_origine, $num_nom_coste) {
604
		if (preg_match('/^(.+)\s*(in .+)$/i', $auteur, $match)) {
605
			if (isset($match[2]) && !empty($match[2]) && isset($match[1]) && !empty($match[1])) {
606
				$auteur = rtrim($match[1], ' ,');
607
				$biblio_origine = $match[2];
608
			}
609
		} elseif (preg_match('/^[^,]+\s*,\s*(.+)$/', $auteur, $match2)) {
610
			if (!preg_match('/^\s*non /i', $match2[1]) && !preg_match('/\s*et /i', $match2[1])) {
611
				if (isset($match2) && !empty($match2)) {
612
					//affichage pour vérfier qu"aucun n'a été oublié
613
					//echo $num_nom_coste;
614
					//print_r($match2);
615
				}
616
			}
617
		} elseif (preg_match('/^(.+) (Sp[.].*)$/', $auteur, $match3)) {
618
			if (isset($match3) && !empty($match3)) {
619
				$auteur = rtrim($match3[1], ', ');
620
				$biblio_origine = $match3[2];
621
			}
622
		}
623
	}
624
 
625
 
626
	private function traiterTypeEpithete(&$type_epithete, &$nom_sci, &$genre, &$epithete_sp, &$epithete_infra_sp) {
627
		if (preg_match('/^([^ ]+) ([^ ]+)(?: ([^ ]+\.) ([^ ]+))?$/', $nom_sci, $match)) {
628
			$genre = $match[1];
629
			$epithete_sp = $match[2];
630
			if (isset($match[3])) {
631
				$type_epithete = $match[3];
632
				//$this->traiterErreur('Nom : '.$nom_sci);
633
			}
634
			if (isset($match[4])) $epithete_infra_sp = $match[4];
635
		} else {
636
			$this->traiterErreur('Erreur pr récupérer la nomenclature pr le nom_sci : '.$nom_sci);
637
		}
638
	}
639
 
640
 
641
	private function insererTableProjetCoste() {
642
		$this->supprimerTableExistante();
643
		$this->creerTableCosteSQL();
644
		$total = 0;
645
		foreach ($this->table_projet as $num_nom => $donnees) {
646
 
647
			foreach ($donnees as $key => $donn) {
648
				if (!in_array($key, array('rang', 'annee', 'tome', 'page'))) {
649
					if ($donn == 'NULL') $donn = '';
650
					$donnees_2[$key] = $this->bdd->proteger($donn);
651
				} else {
652
					if ($donn == '') $donn = 'null';
653
					$donnees_2[$key] = $donn;
654
				}
655
			}
292 jpm 656
			$req = 'INSERT INTO coste_v0_2 VALUES ('.$num_nom.', '.implode(', ', $donnees_2).')';
11 jpm 657
			$res = $this->bdd->requeter($req);
658
 
659
			if ($res) {
660
				$this->afficherAvancement('Insertion des noms dans Coste');
661
			} else {
662
				$this->afficherAvancement('Erreur d\'insertion des noms dans coste');
663
			}
664
		}
665
	}
666
 
667
	private function supprimerTableExistante() {
668
		$req = 'DROP TABLE coste_v0_2';
669
		$res = $this->bdd->requeter($req);
670
		if ($res) {
671
			$this->traiterInfo('La table coste a été supprimer');
672
		}
673
	}
674
 
675
	private function creerTableCosteSQL() {
676
		$requete = 'CREATE TABLE IF NOT EXISTS coste_v0_2 (
677
				num_nom int(9) NOT NULL DEFAULT 0,
678
				num_nom_retenu varchar(9) DEFAULT NULL,
679
				num_tax_sup varchar(9) DEFAULT NULL,
680
				rang int(3),
681
				nom_sci varchar(500) CHARACTER SET utf8 DEFAULT "",
682
				nom_supra_generique varchar(500) CHARACTER SET utf8 DEFAULT "",
683
				genre varchar(500) CHARACTER SET utf8 DEFAULT "",
684
				epithete_infra_generique varchar(500) CHARACTER SET utf8 DEFAULT "",
685
				epithete_sp varchar(500) CHARACTER SET utf8 DEFAULT "",
686
				type_epithete varchar(500) CHARACTER SET utf8 DEFAULT "",
687
				epithete_infra_sp varchar(500) CHARACTER SET utf8 DEFAULT "",
688
				cultivar_groupe varchar(500) CHARACTER SET utf8 DEFAULT "",
689
				cultivar varchar(500) CHARACTER SET utf8 DEFAULT "",
690
				nom_commercial varchar(500) CHARACTER SET utf8 DEFAULT "",
691
				auteur varchar(100) CHARACTER SET utf8 DEFAULT "",
692
				annee int(4) DEFAULT NULL,
693
				biblio_origine varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
694
				notes varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
695
				nom_addendum varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
696
				basionyme varchar(9) CHARACTER SET utf8 NOT NULL DEFAULT "",
697
				nom_francais text CHARACTER SET utf8 DEFAULT "",
698
				nom_coste varchar(500) CHARACTER SET utf8 DEFAULT "",
699
				num_nom_coste varchar(9) CHARACTER SET utf8 DEFAULT "",
700
				tome int(1) DEFAULT NULL,
701
				page int(4) DEFAULT NULL,
702
				flore_bdnff_num varchar(9) DEFAULT NULL,
703
				flore_bdnff_nom_sci varchar(500) CHARACTER SET utf8 DEFAULT NULL,
704
				nom_sci_html varchar(500) CHARACTER SET utf8 DEFAULT NULL,
705
				PRIMARY KEY (num_nom)
706
				) ENGINE=MyISAM DEFAULT CHARSET=utf8';
707
		$res = $this->bdd->requeter($requete);
708
		if ($res) {
709
			$this->traiterInfo('La table coste a été crée');
710
		} else {
711
			$this->traiterErreur('Probleme : la table coste n\'a pas été créée');
712
		}
713
	}
714
 
715
 
716
	private function creerFichier($fichier, $tab, $chemin = null) {
717
		if (!$chemin) {
718
			$chemin = Config::get('chemin_test');
719
		}
720
		$intitule = '';
721
		$nom_fichier = fopen($chemin.$fichier, 'w+');
722
		foreach ($tab as $key => $val) {
723
			foreach ($val as $k => $v) {
724
				$intitule .= $k."\t";
725
			}
726
			fwrite($nom_fichier, trim($intitule)."\n");
727
			break;
728
		}
729
		foreach ($tab as $key => $val) {
730
			fwrite($nom_fichier, implode("\t", $val)."\n");
731
		}
732
		fclose($nom_fichier);
733
	}
734
 
735
 
736
}
737
?>