Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 292 | Blame | Last modification | View Log | RSS feed

<?php

// commande : /opt/lampp/bin/php cli.php description_sp -a tester -n /home/jennifer/Tela-botanica_projets/Coste/descriptions/html

class DescriptionSp extends Script {

        protected $donnees = array();
        protected $nb_espece = 0;
        protected $donnees_espece = array();
        protected $fichier;
        protected $table_espece = array();

        protected $parametres_autorises = array(
                '-n' => array(true, null, 'nom du dossier à analyser'));

        public function executer() {
                $this->bdd = new Bdd();

                // Lancement de l'action demandée
                $cmd = $this->getParametre('a');
                switch ($cmd) {
                        case 'integrer' :
                                $this->supprimerPagesExistantes();
                                $this->reinitialiserAutoIncrement('coste_pages');
                                $this->reinitialiserAutoIncrement('coste_triples');

                                $this->ouvrirDossier();
                                $this->chargerIndexGpFG();
                                $this->integrerSynonyme();
                                ksort($this->table_espece);
                                $this->recupererDonneesBdnff();
                                $this->genererNumNom();
                                $this->insererNumNomDansTriples();
                                $this->creerTableCoste();
                                $this->insererTableProjetCoste();
                                break;
                        default :
                                $this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
                }
        }

//---------------------------------FONCTION DE RECUPERATION DES DONNEES SUR LES ESPECES---------------------------------

        private function ouvrirDossier() {
                $nomDossier = $this->getParametre('n');
                $tableaux = null;
                if (file_exists($nomDossier) === true) {
                        if (is_dir($nomDossier)) {
                                if ($dossierOuvert = opendir($nomDossier) ) {
                                        while ( ($nomFichier = readdir($dossierOuvert)) !== false) {
                                                if ( !is_dir($nomFichier) && preg_match('/e[0-9]{4}\.htm/', $nomFichier)) {
                                                        $nomFichier = $nomDossier.'/'.$nomFichier;
                                                        $this->traiterFichier($nomFichier);
                                                }
                                        }
                                        closedir($dossierOuvert);
                                } else {
                                        $this->traiterErreur("Le dossier $nomDossier n'a pas pu être ouvert.");
                                }
                        } else {
                                $tableaux[$nomDossier] = $this->ouvrirFichier($nomDossier);
                        }
                } else {
                        $this->traiterErreur("Le dossier $nomDossier est introuvable.");
                }
                $this->traiterInfo('Nombre d\'espèce : '.$this->nb_espece);
                //$this->creerFichier('donneesEspeces.tsv', $this->donnees_espece, '/home/jennifer/Tela-botanica_projets/Coste/descriptions/');
                return $tableaux;
        }

        private function supprimerPagesExistantes() {
                //suppression des tuples déjà existants
                $requete = 'DELETE FROM coste_pages WHERE id > 35';
                $this->bdd->requeter($requete);
                $requete = 'DELETE FROM coste_triples WHERE id > 1';
                $this->bdd->requeter($requete);
                $requete = 'DELETE FROM coste_correspondance_bdnff ';
                $this->bdd->requeter($requete);
                $this->traiterInfo('Table coste_pages, coste_triple et coste_correspondance_bdnff ont été vidés :)');
        }


        private function reinitialiserAutoIncrement($table) {
                $requete_max_id = 'SELECT max(id) FROM '.$table;
                $id_max = $this->bdd->recuperer($requete_max_id);
                $id_max = $id_max['max(id)'];
                $id_max = $id_max+1;
                $requete_pages = 'ALTER TABLE '.$table.' AUTO_INCREMENT = '.$id_max;
                $this->bdd->requeter($requete_pages);
        }


        private function traiterFichier($nomFichier) {
                $donnees = $this->ouvrirFichier($nomFichier);
                if ($donnees['ouvert'] == "oui") {
                        $donneesTag = $this->creerNomPage($donnees['tag']);
                        //on insère le triple titre dans coste_triples
                        $this->donnees_espece[] = $donneesTag;
                        $requetePage = 'INSERT INTO coste_pages (tag, time, body, latest) VALUES ("'
                                                        .$donneesTag['nomPage'].'", NOW(), "'.$donnees['texte'].'", "Y");';
                        $requeteTriple = 'INSERT INTO coste_triples(resource, property, value) VALUES '
                                                        .'("'.$donneesTag['nomPage'].'", "titre", "'.$donneesTag['titre'].'"),';
                        //on insère les correspondances avec bdnff
                        $donneesCorr = $this->creerCorrespondance($donnees['correspondance']);
                        $requeteCorr = 'INSERT INTO coste_correspondance_bdnff VALUES ("'
                                                        .$donneesTag['id'].'", "'.$donneesCorr['num_nom'].'", "'
                                                        .$donneesCorr['num_tax'].'", "'.$donneesCorr['famille'].'", "'.$donneesCorr['nom_sci'].'");';
                        $requete = $requetePage." ".rtrim($requeteTriple, ',')."; ".$requeteCorr;
                        $this->bdd->requeter($requete);

                        $this->nb_espece++;
                        $this->afficherAvancement("insertion espece");
                }
        }

        private function ouvrirFichier($nomFichier) {
                $this->fichier = $nomFichier;
                $donnees = null;
                if (file_exists($nomFichier) === true && preg_match('/e[0-9]{4}.htm$/', $nomFichier)) {
                        if ( $fichierOuvert = fopen($nomFichier, 'r') ) {
                                $donnees['ouvert'] = "oui";
                                $i = 1;
                                while ($ligne = fgets($fichierOuvert)) {
                                        if ($i == 24) {
                                                $donnees['tag'] = $this->traiterHtml($ligne);
                                        } elseif ($i == 45) {
                                                $donnees['texte'] = $this->traiterHtml($ligne, $au = true);
                                                $this->donnees['texte'] = $this->traiterHtml($ligne);
                                        } elseif ($i == 46 || $i == 47) {
                                                $donnees['texte'] .= $this->traiterHtml($ligne);
                                        } elseif ($i == 63 || preg_match('/Bdnff /ui', $ligne)) {
                                                $donnees['correspondance'] = $this->traiterHtml($ligne);
                                        }
                                        $i++;
                                }
                                fclose($fichierOuvert);
                        } else {
                                $this->traiterErreur("Le fichier $nomFichier n'a pas pu être ouvert.");
                        }
                } else {
                        $this->traiterErreur("Le fichier $nomFichier est introuvable.");
                }
                return $donnees;
        }


        private function traiterHtml($donnees, $au = null) {
                $donnees_traitees = strip_tags($donnees,'<B>,<I>');
                $donnees_traitees = html_entity_decode($donnees_traitees, ENT_NOQUOTES, 'UTF-8');
                $donnees_traitees = str_replace('<B>', '**', $donnees_traitees);
                $donnees_traitees = str_replace('</B>', '**', $donnees_traitees);
                $donnees_traitees = str_replace('<I>', '//', $donnees_traitees);
                $donnees_traitees = str_replace('</I>', '//', $donnees_traitees);
                $donnees_traitees = trim($donnees_traitees);
                if ($au) {
                        $donnees_traitees = str_replace('&#173;', '', $donnees_traitees);
                }
                return $donnees_traitees;
        }


        private function creerNomPage($tag) {
                $partiesTag = explode(' - ', $tag);
                preg_match('/(C.*)/', $tag, $titre);
                $donnees['titre'] = $titre[0];

                list($num, $donnees['id']) = explode(' ', trim($partiesTag[0]));
                list($num, $donnees['num_nom_coste'] )  =  explode(' ', trim($partiesTag[0]));
                $donnees['nom_sci'] = trim($partiesTag[1]);
                $partiesNomSci = explode(' ', $donnees['nom_sci']);

                list($numFamille, $donnees['famille']) = explode(', ', trim($partiesTag[2]));
                list($num, $tomePage) = explode(',', trim($partiesTag[3]));

                if (preg_match('/T(\d*)\.p(\d*)/', $tomePage, $match)){
                        $donnees['tome'] = $match[1];
                        $donnees['page'] = sprintf("%04d",$match[2]);
                }
                $donnees['nomPage'] = 'DscCoste1937T'.$donnees['tome'].'P'.$donnees['page'].implode(array_map('ucfirst',$partiesNomSci));
                if ($donnees['nomPage'] == 'DscCoste1937TP') echo 'MERDE!!!!!!!!!!!! à la page '.$this->fichier;
                $partieNumTaxSupFamille = explode(',', $partiesTag[2]);
                $partieNumTaxSupGenre = explode(',', $partiesTag[3]);
                $donnees['num_tax_sup_genre'] = trim($partieNumTaxSupGenre[0]);
                //on recupère les auteurs, synonymes et nom_vernaculaires
                $this->recupererInfosComplementaires($donnees);
                return $donnees;
        }


        private function recupererInfosComplementaires(&$donnees) {
                $this->donnees['texte'] = str_replace('­', '', $this->donnees['texte']); //on enlève un petit tiret présent entre la plupart des mots (non visible ici)
                preg_match('/^ {0,1}[*]{2}([^*]+)[*]{2} ([^–(\/]+\.?)?\s*(?:[(]([^)]+)[)])?[ –.]*(?:[\/]{2}([^\/]+)\s*–\s*[\/]{2})?/', $this->donnees['texte'], $match2);

                $annee = '';
                if ($match2 == array()) echo "donnees du fichier : $this->fichier";
                if (isset($match2[1]) && strrpos($match2[1], ' subsp. ') !== false) {
                        $donnees['nom_sci'] = preg_replace(array('/ All./', '/ L./','/^\s*[0-9]{4}[ –.]*/'), '', $match2[1]);
                }
                $auteur = (isset($match2[2])) ? $match2[2] : '';
                $synonyme = (isset($match2[3])) ? $match2[3] : '';
                $nom_verna = (isset($match2[4])) ? $match2[4] : '';
                if (preg_match('/^\s*[1-9]{4}\s*$/', $synonyme)) {
                        $annee = $synonyme;
                        $synonyme = '';
                } elseif (preg_match('/.*?([0-9]{4})/', $auteur, $annee_match) && !preg_match('/ in /', $annee_match[1])) {
                        $annee = $annee_match[1];
                        $auteur = preg_replace('/ [0-9]{4}/', '', $auteur);
                }
                $donnees['annee'] = $annee;
                $donnees['auteur'] = $auteur;
                $donnees['synonyme'] = $synonyme;
                $donnees['nom_vernaculaire'] = $nom_verna;
                $this->insererDansTableEspece($donnees);
        }


        private function insererDansTableEspece($donnees) {
                $this->table_espece[$donnees['num_nom_coste']] = array(
                                                                                                                'tag' => $donnees['nomPage'],
                                                                                                                'num_nom_retenu_coste' => $donnees['num_nom_coste'],
                                                                                                                'num_nom_coste' => $donnees['num_nom_coste'],
                                                                                                                'num_tax_sup_genre' => $donnees['num_tax_sup_genre'],
                                                                                                                'rang' => 290,
                                                                                                                'nom_sci' => $donnees['nom_sci'],
                                                                                                                'auteur' => $donnees['auteur'],
                                                                                                                'nom_vernaculaire' => $donnees['nom_vernaculaire'],
                                                                                                                'nom_coste' => $donnees['nom_sci'],
                                                                                                                'tome' => $donnees['tome'],
                                                                                                                'annee' => $donnees['annee'],
                                                                                                                'synonyme' => $donnees['synonyme']);
        }


        private function creerCorrespondance($correspondance) {
                $parties = explode('-', $correspondance);
                if (isset($parties[1])) {
                        list($num, $donnees['num_nom']) = explode(' ', trim($parties[0]));
                        $donnees['nom_sci'] = trim($parties[1]);
                        $donnees['famille'] = trim($parties[2]);
                        list($num, $num_tax) = explode('=', trim($parties[3]));
                        $donnees['num_tax'] = ($num_tax == "") ? 'NULL' : $num_tax;
                } else {
                        $donnees['num_nom'] = 'NULL';
                        $donnees['nom_sci'] = 'NULL';
                        $donnees['famille'] = 'NULL';
                        $donnees['num_tax'] = 'NULL';
                }
                return $donnees;
        }

//---------------------------------------FONCTION DE CREATION DE LA TABLE COSTE------------------------------------------

        private function chargerIndexGpFG() {
                $requete =      'SELECT * FROM coste_index_general ';
                $resultat = $this->bdd->recupererTous($requete);
                foreach ($resultat as $nom) {
                        $nom_coste = ($nom['nom_coste'] == '') ? $this->transliterer($nom['nom_sci']) : $this->transliterer($nom['nom_coste']);
                        $nom_sci = $this->transliterer($nom['nom_sci']);
                        $tome = $nom['tome'];
                        $page = $nom['page'];
                        $num_tax_sup_coste = $nom['num_tax_sup_coste'];
                        $num_nom_coste = $nom['num_nom_coste'];
                        $rang = $nom['rang'];
                        $this->indexGpFG[$num_nom_coste] = array('nom_sci' => $nom_sci,
                                                                                                        'rang' => $rang,
                                                                                                        'nom_coste' => $nom_coste,
                                                                                                        'num_nom_coste' => $num_nom_coste,
                                                                                                        'num_tax_sup_coste' => $num_tax_sup_coste,
                                                                                                        'tome' => $tome,
                                                                                                        'page' => $page);
                }
        }


        private function transliterer($txt) {
                $txt = ucwords(strtolower(Chaine::supprimerAccents($txt)));
                return trim($txt);
        }


        private function integrerSynonyme() {
                foreach ($this->table_espece as $num_nom_coste => $donnees) {
                        $et = false; //cas où on a "syno et syno L."
                        $auteur = '';
                        $genre_syn = '';
                        if ($donnees['synonyme'] != '') {
                                $donnees['synonyme'] = preg_replace(array('/^t\s{1}/','/^et\s{1}/', '/^avec /', '/, etc\.$/', '/\//', '/­/'), '', $donnees['synonyme']);
                                if (strrpos($donnees['synonyme'], ';') === false
                                && preg_match('/^[A-Z][^ ]+ [^ ]+(?: ([^,;]+))?\s*[.]?(et|,)[ ]?[A-Z]{1}[^ on,]+ [^., ]+[ ]+(?:.*)?$/', $donnees['synonyme'], $ponctu)) {
                                        if ($ponctu[2] == 'et') {
                                                $synonymes = array_reverse(explode($ponctu[2], $donnees['synonyme']));
                                                $et = true;
                                        } else {
                                                $synonymes = explode($ponctu[2], $donnees['synonyme']);
                                        }
                                } else {
                                        $synonymes = explode(';', $donnees['synonyme']);
                                }
                                $num_syn = 0; //on numerote les synonyme avec comme num_nom_coste : num_nom_coste du retenu + ".1", ".2" , ...
                                foreach ($synonymes as $nom_syn) {
                                        $annee = '';
                                        $notes = $this->recupererLesNotesDesSynonymes($nom_syn);
                                        $this->recupererAnneeSynonyme($nom_syn, $annee);
                                        if (preg_match('/^\s*([^ ]*) ([^ ]*)( (?:VAR\.|v\.) [^ ]+)?(?: (.*))?$/', $nom_syn, $match)) {
                                                $num_syn++;
                                                $nom_sci = $this->recupererNomSciComplet($match, $donnees, $num_syn, $genre_syn);
                                                $auteur_syn = $this->recupererAuteurSyn($match, $auteur, $et);
                                                $this->ajouterSynonymeALaTableEspece($donnees, $nom_sci, $auteur_syn, $annee, $notes, $num_syn);
                                        } else {
                                                $this->traiterErreur('Synonyme '.$nom_syn.' non reconnu par l\'expression régulière ');
                                        }
                                }
                        }
                }
        }


        private function recupererNomSciComplet(&$match, &$donnees, &$num_syn, &$genre_syn) {
                //on récupère le nom complet du genre dans les cas ou le genre est noté : A.
                //Attention à l'ex suivant : D. THUILLIERI G. G. ; AIRA SETACEA Huds.; A. DISCOLOR Thuil.; A. ULIGINOSA Weihe
                if ($num_syn == 1 && preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
                        preg_match('/\s*([^ ]+) .+$/', $donnees['nom_sci'], $nom_genre);
                        $match[1] = $nom_genre[1];
                        $genre_syn = $nom_genre[1];
                } elseif (!preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
                        $genre_syn = $match[1];
                } elseif ($num_syn != 1 && preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
                        $match[1] = $genre_syn;
                }
                if (isset($match[3])) {
                        $nom_sci = ucfirst(strtolower($match[1].' '.$match[2].str_replace('v. ', 'var. ', $match[3])));
                } else {
                        $nom_sci = ucfirst(strtolower($match[1].' '.$match[2]));
                }
                return $nom_sci;
        }


        private function recupererAnneeSynonyme(&$nom_syn, &$annee) {
                if (preg_match('/ ([0-9]{4})\s*/', $nom_syn, $annee_match)) {
                        $annee = $annee_match[1];
                }
        }


        private function recupererAuteurSyn(&$match, &$auteur, &$et) {
                //on recupere l'auteur ds une variable ds le cas ou : R. machin et R. truc auteur.
                if (isset($match[4]) && $match[4] != '' && $et) {
                        $auteur = $match[4];
                }
                $auteur_syn = $auteur;
                if (isset($match[3]) && !$et) {
                        $auteur_syn = preg_replace('/ [0-9]{4}/', '', $match[4]);
                } elseif ($auteur != '' && $et) {
                        $auteur_syn = preg_replace('/ [0-9]{4}/', '', $auteur);
                }
                return $auteur_syn;
        }

        public function recupererLesNotesDesSynonymes(&$nom_syn) {
                // on recupère les notes
                if (preg_match('/^(ompr.|incl.) (.*)/i', $nom_syn, $note_abbr)) {
                        $notes = ($note_abbr[1] == 'ompr.') ? 'compr.' : 'incl.';
                        $nom_syn = $note_abbr[2];
                } else {
                        $notes = '';
                }
                return $notes;
        }

        public function ajouterSynonymeALaTableEspece($donnees, $nom_sci, $auteur_syn, $annee, $notes, $num_syn) {
                $num_nom_coste_syn = $donnees['num_nom_coste'].'.'.$num_syn;
                $this->table_espece[$num_nom_coste_syn] = array(
                                                                                                'num_nom_coste' => $donnees['num_nom_coste'].'.'.$num_syn,
                                                                                                'num_nom_retenu_coste' => $donnees['num_nom_coste'],
                                                                                                'num_tax_sup_genre' => $donnees['num_tax_sup_genre'],
                                                                                                'rang' => 290,
                                                                                                'nom_sci' => $nom_sci,
                                                                                                'auteur' => $auteur_syn,
                                                                                                'nom_vernaculaire' => '',
                                                                                                'nom_coste' => $nom_sci,
                                                                                                'tome' => $donnees['tome'],
                                                                                                'annee' => $annee,
                                                                                                'flore_bdnff_num' => '',
                                                                                                'flore_bdnff_nom_sci' => '',
                                                                                                'notes' => $notes);
        }

        private function recupererDonneesBdnff() {
                $req = "SELECT * FROM coste_correspondance_bdnff";
                $res = $this->bdd->recupererTous($req);
                $total = 0;
                if ($res) {
                        foreach ($res as $espece_bdnff) {
                                $num_nom_coste = $espece_bdnff['id'];
                                if (isset($this->table_espece[$num_nom_coste])) {
                                        $this->table_espece[$num_nom_coste]['flore_bdnff_num'] = $espece_bdnff['num_nom'];
                                        $this->table_espece[$num_nom_coste]['flore_bdnff_num_tax'] = $espece_bdnff['num_tax'];
                                        $this->table_espece[$num_nom_coste]['flore_bdnff_nom_sci'] = $espece_bdnff['nom_sci'];
                                        $total++;
                                } else {
                                        $e = "Le num_nom_coste $num_nom_coste de la table de correspondance bdnff n'exsite pas dans la table donneesEspece ";
                                        $this->traiterErreur($e);
                                }
                        }
                } else {
                        $this->traiterErreur('recupererDonneesBdnff() : mauvaise requete');
                }
                if ($total != 0) {
                        $this->traiterInfo('Donnees de la bdnff recuperées pour les especes. Total bdnff = '.$total.'\n');
                }
        }


        private function genererNumNom() {
                $this->table_num_nom = array();
                $num_nom = 1;
                foreach($this->indexGpFG as $donneesCle) {
                        $this->table_num_nom[$num_nom] = $donneesCle['num_nom_coste'];
                        $this->indexGpFG[$donneesCle['num_nom_coste']]['num_nom'] = $num_nom;
                        $num_nom++;
                        if (preg_match('/^G[0-9]+/',$donneesCle['num_nom_coste'])) {
                                foreach ($this->table_espece as $donneesEspece) {
                                        if ($donneesEspece['num_tax_sup_genre'] == $donneesCle['num_nom_coste']) {
                                                $this->table_num_nom[$num_nom] = $donneesEspece['num_nom_coste'];
                                                $this->table_espece[$donneesEspece['num_nom_coste']]['num_nom'] = $num_nom;
                                                $num_nom++;
                                        }
                                }
                        }
                }
                if ($this->table_num_nom != array()) $this->traiterInfo('Num_nom generer. Total num_nom = '.count($this->table_num_nom));
                else $this->traiterErreur( 'erreur dans la génération des num_nom\n');
        }


        private function insererNumNomDansTriples() {
                $table_triples = array();
                foreach ($this->table_espece as $num_nom_coste => $donnees) {
                        if (isset($donnees['synonyme'])) {
                                $table_triples[] = array('resource' => $donnees['tag'], 'property' => 'num_nom', 'value' => $donnees['num_nom']);
                        }
                }
                $this->suppressionTriplesExistants();
                $this->reinitialiserAutoIncrement('coste_triples');
                //insertion des triples num_nom en une seule requete
                foreach ($table_triples as $triple) {
                        $resource = $this->bdd->proteger($triple['resource']);
                        $property = $this->bdd->proteger($triple['property']);
                        $value = $this->bdd->proteger($triple['value']);
                        $requete = "INSERT INTO coste_triples (resource, property, value) VALUES ($resource,$property ,$value)";
                        $res = $this->bdd->requeter($requete);
                        if ($res) {
                                $this->afficherAvancement('Insertion des triples existants');
                        } else {
                                $this->afficherAvancement('Erreur de insertion des triples existants');
                        }
                }
        }

        private function suppressionTriplesExistants() {
                $requete = 'DELETE FROM coste_triples '.
                                'WHERE property = "num_nom"'.
                                'AND resource IN ("'.implode(array_keys($this->table_espece), '","').'")';
                $res = $this->bdd->requeter($requete);
                if ($res == '') {
                        $this->traiterErreur('Suppression des triples existants : aucun existant');
                } elseif ($res) {
                        $this->traiterInfo('Suppression des triples existants');
                } else {
                        $this->traiterErreur('Erreur de suppression des triples existants');
                }
        }

        private function creerTableCoste() {
                $this->insererGpFG();
                $this->insererEspeces();
                ksort($this->table_projet);
        }

        private function insererGpFG() {
                $total = 0;
                foreach ($this->indexGpFG as $donneesGpFG) {
                        $num_nom = $donneesGpFG['num_nom'];
                        $num_nom_retenu = $donneesGpFG['num_nom'];
                        $num_tax_sup = array_search($donneesGpFG['num_tax_sup_coste'], $this->table_num_nom);
                        $annee = '';
                        $nom_sci = $donneesGpFG['nom_sci'];
                        $rang = $donneesGpFG['rang'];
                        $nom_coste = $donneesGpFG['nom_coste'];
                        $num_nom_coste = $donneesGpFG['num_nom_coste'];
                        $tome = $donneesGpFG['tome'];
                        $page = $donneesGpFG['page'];
                        $genre = '';
                        $nom_supra_generique = '';
                        if ($rang != '220') {
                                $nom_supra_generique = $nom_sci;
                        } else {
                                $genre = $nom_sci;
                        }

                        $this->table_projet[$num_nom] = array(
                                'num_nom_retenu' => $num_nom_retenu,
                                'num_tax_sup' => $num_tax_sup,
                                'rang' => $rang,
                                'nom_sci' => $nom_sci,
                                'nom_supra_generique' => $nom_supra_generique,
                                'genre' => $genre,
                                'epithete_infra_generique' => '',
                                'epithete_sp' => '',
                                'type_epithete' => '',
                                'epithete_infra_sp' => '',
                                'cultivar_groupe' => '',
                                'cultivar' => '',
                                'nom_commercial' => '',
                                'auteur' => '',
                                'annee' => '',
                                'biblio_origine' => '',
                                'notes' => '',
                                'nom_adenddum' => '',
                                'basionyme' => '',
                                'nom_francais' => '',
                                'nom_coste' => $nom_coste,
                                'num_nom_coste' => $num_nom_coste,
                                'tome' => $tome,
                                'page' => $page,
                                'flore_bdnff_num' => '',
                                'flore_bdnff_nom_sci' => '',
                                'nom_sci_html' => ''
                        );
                        $total++;
                }
                $this->traiterInfo('Donnees ajoutées à la table pour les groupes, familles et genres. Total donnees = '.$total.'\n');
        }


        private function insererEspeces() {
                $total = 0;
                foreach ($this->table_espece as $donnees) {
                        $num_nom = $donnees['num_nom'];
                        if (isset($donnees['num_nom_retenu_coste'])) {
                                $num_nom_retenu = array_search($donnees['num_nom_retenu_coste'], $this->table_num_nom); //on recupere le num_nom à partir du num_nom_coste
                        } else {
                                $num_nom_retenu = $donnees['num_nom'];
                        }
                        $num_tax_sup = array_search($donnees['num_tax_sup_genre'], $this->table_num_nom); //on recupere le num_nom à partir du num_nom_coste
                        $nom_sci = $donnees['nom_sci'];
                        $rang = $donnees['rang'];
                        $nom_coste = $donnees['nom_coste'];
                        $num_nom_coste = (preg_match('/^([0-9]+)(?:\.[0-9]{1})?$/', $donnees['num_nom_coste'], $match)) ? $match[1] : $donnees['num_nom_coste'];
                        $tome = $donnees['tome'];
                        $auteur = $donnees['auteur'];
                        $annee = $donnees['annee'];
                        //$synonyme = $donnees['synonyme'];
                        $nom_verna = $donnees['nom_vernaculaire'];
                        $flore_bdnff_num = $donnees['flore_bdnff_num'];
                        $flore_bdnff_nom_sci = $donnees['flore_bdnff_nom_sci'];
                        $notes = (isset($donnees['notes'])) ? $donnees['notes'] : '';
                        $genre = '';
                        $epithete_sp = '';
                        $type_epithete = '';
                        $epithete_infra_sp = '';
                        $biblio_origine = '';
                        if ($num_nom_coste == '1988') $auteur = 'Coste';
                        $this->traiterTypeEpithete($type_epithete, $nom_sci, $genre, $epithete_sp, $epithete_infra_sp);
                        $this->traiterRefBiblio($auteur, $biblio_origine, $num_nom_coste);

                        $this->table_projet[$num_nom] = array(
                                'num_nom_retenu' => $num_nom_retenu,
                                'num_tax_sup' => $num_tax_sup,
                                'rang' => $rang,
                                'nom_sci' => $nom_sci,
                                'nom_supra_generique' => '',
                                'genre' => $genre,
                                'epithete_infra_generique' => '',
                                'epithete_sp' => $epithete_sp,
                                'type_epithete' => $type_epithete,
                                'epithete_infra_sp' => $epithete_infra_sp,
                                'cultivar_groupe' => '',
                                'cultivar' => '',
                                'nom_commercial' => '',
                                'auteur' => $auteur,
                                'annee' => $annee,
                                'biblio_origine' => $biblio_origine,
                                'notes' => $notes,
                                'nom_adenddum' => '',
                                'basionyme' => '',
                                'nom_francais' => $nom_verna,
                                'nom_coste' => $nom_coste,
                                'num_nom_coste' => $num_nom_coste,
                                'tome' => $tome,
                                'page' => null,
                                'flore_bdnff_num' => $flore_bdnff_num,
                                'flore_bdnff_nom_sci' => $flore_bdnff_nom_sci,
                                'nom_sci_html' => ''
                        );
                        $total++;
                }
                $this->traiterInfo('Donnees ajoutées à la table pour les especes. Total donnees = '.$total.'\n');
        }


        private function traiterRefBiblio(&$auteur, &$biblio_origine, $num_nom_coste) {
                if (preg_match('/^(.+)\s*(in .+)$/i', $auteur, $match)) {
                        if (isset($match[2]) && !empty($match[2]) && isset($match[1]) && !empty($match[1])) {
                                $auteur = rtrim($match[1], ' ,');
                                $biblio_origine = $match[2];
                        }
                } elseif (preg_match('/^[^,]+\s*,\s*(.+)$/', $auteur, $match2)) {
                        if (!preg_match('/^\s*non /i', $match2[1]) && !preg_match('/\s*et /i', $match2[1])) {
                                if (isset($match2) && !empty($match2)) {
                                        //affichage pour vérfier qu"aucun n'a été oublié
                                        //echo $num_nom_coste;
                                        //print_r($match2);
                                }
                        }
                } elseif (preg_match('/^(.+) (Sp[.].*)$/', $auteur, $match3)) {
                        if (isset($match3) && !empty($match3)) {
                                $auteur = rtrim($match3[1], ', ');
                                $biblio_origine = $match3[2];
                        }
                }
        }


        private function traiterTypeEpithete(&$type_epithete, &$nom_sci, &$genre, &$epithete_sp, &$epithete_infra_sp) {
                if (preg_match('/^([^ ]+) ([^ ]+)(?: ([^ ]+\.) ([^ ]+))?$/', $nom_sci, $match)) {
                        $genre = $match[1];
                        $epithete_sp = $match[2];
                        if (isset($match[3])) {
                                $type_epithete = $match[3];
                                //$this->traiterErreur('Nom : '.$nom_sci);
                        }
                        if (isset($match[4])) $epithete_infra_sp = $match[4];
                } else {
                        $this->traiterErreur('Erreur pr récupérer la nomenclature pr le nom_sci : '.$nom_sci);
                }
        }


        private function insererTableProjetCoste() {
                $this->supprimerTableExistante();
                $this->creerTableCosteSQL();
                $total = 0;
                foreach ($this->table_projet as $num_nom => $donnees) {

                        foreach ($donnees as $key => $donn) {
                                if (!in_array($key, array('rang', 'annee', 'tome', 'page'))) {
                                        if ($donn == 'NULL') $donn = '';
                                        $donnees_2[$key] = $this->bdd->proteger($donn);
                                } else {
                                        if ($donn == '') $donn = 'null';
                                        $donnees_2[$key] = $donn;
                                }
                        }
                        $req = 'INSERT INTO coste_v0_2 VALUES ('.$num_nom.', '.implode(', ', $donnees_2).')';
                        $res = $this->bdd->requeter($req);

                        if ($res) {
                                $this->afficherAvancement('Insertion des noms dans Coste');
                        } else {
                                $this->afficherAvancement('Erreur d\'insertion des noms dans coste');
                        }
                }
        }

        private function supprimerTableExistante() {
                $req = 'DROP TABLE coste_v0_2';
                $res = $this->bdd->requeter($req);
                if ($res) {
                        $this->traiterInfo('La table coste a été supprimer');
                }
        }

        private function creerTableCosteSQL() {
                $requete = 'CREATE TABLE IF NOT EXISTS coste_v0_2 (
                                num_nom int(9) NOT NULL DEFAULT 0,
                                num_nom_retenu varchar(9) DEFAULT NULL,
                                num_tax_sup varchar(9) DEFAULT NULL,
                                rang int(3),
                                nom_sci varchar(500) CHARACTER SET utf8 DEFAULT "",
                                nom_supra_generique varchar(500) CHARACTER SET utf8 DEFAULT "",
                                genre varchar(500) CHARACTER SET utf8 DEFAULT "",
                                epithete_infra_generique varchar(500) CHARACTER SET utf8 DEFAULT "",
                                epithete_sp varchar(500) CHARACTER SET utf8 DEFAULT "",
                                type_epithete varchar(500) CHARACTER SET utf8 DEFAULT "",
                                epithete_infra_sp varchar(500) CHARACTER SET utf8 DEFAULT "",
                                cultivar_groupe varchar(500) CHARACTER SET utf8 DEFAULT "",
                                cultivar varchar(500) CHARACTER SET utf8 DEFAULT "",
                                nom_commercial varchar(500) CHARACTER SET utf8 DEFAULT "",
                                auteur varchar(100) CHARACTER SET utf8 DEFAULT "",
                                annee int(4) DEFAULT NULL,
                                biblio_origine varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
                                notes varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
                                nom_addendum varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
                                basionyme varchar(9) CHARACTER SET utf8 NOT NULL DEFAULT "",
                                nom_francais text CHARACTER SET utf8 DEFAULT "",
                                nom_coste varchar(500) CHARACTER SET utf8 DEFAULT "",
                                num_nom_coste varchar(9) CHARACTER SET utf8 DEFAULT "",
                                tome int(1) DEFAULT NULL,
                                page int(4) DEFAULT NULL,
                                flore_bdnff_num varchar(9) DEFAULT NULL,
                                flore_bdnff_nom_sci varchar(500) CHARACTER SET utf8 DEFAULT NULL,
                                nom_sci_html varchar(500) CHARACTER SET utf8 DEFAULT NULL,
                                PRIMARY KEY (num_nom)
                                ) ENGINE=MyISAM DEFAULT CHARSET=utf8';
                $res = $this->bdd->requeter($requete);
                if ($res) {
                        $this->traiterInfo('La table coste a été crée');
                } else {
                        $this->traiterErreur('Probleme : la table coste n\'a pas été créée');
                }
        }


        private function creerFichier($fichier, $tab, $chemin = null) {
                if (!$chemin) {
                        $chemin = Config::get('chemin_test');
                }
                $intitule = '';
                $nom_fichier = fopen($chemin.$fichier, 'w+');
                foreach ($tab as $key => $val) {
                        foreach ($val as $k => $v) {
                                $intitule .= $k."\t";
                        }
                        fwrite($nom_fichier, trim($intitule)."\n");
                        break;
                }
                foreach ($tab as $key => $val) {
                        fwrite($nom_fichier, implode("\t", $val)."\n");
                }
                fclose($nom_fichier);
        }


}
?>