Subversion Repositories eFlore/Projets.eflore-projets

Rev

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