Chapitre 4 : les macro Excel pour effectuer la normalisation et la

Transcription

Chapitre 4 : les macro Excel pour effectuer la normalisation et la
Activité d’appel à données CABIN 2013
Soutien à distance pour la publication on-line de données de biodiversité
Chapitre 4 : les macro Excel pour effectuer la
normalisation et la conversion vers le code
SQL
1 Introduction
Cette partie de l’activité de publication de données concerne l’utilisation de plusieurs
macros Excel, créées pour les besoins du projet. Elles facilitent la normalisation de
données provenant d’un logiciel tableur ainsi que leur migration vers une base de
données relationnelle.
2 Note importante sur l’opportunité de normaliser et d’utiliser ces
macros:
Ces macros ont été développées pour enseigner la normalisation des données et générer
des bases de données relationnelles au départ de Microsoft Excel. Si vous êtes familier
avec Excel et comptez conserver cet outil pour stocker vos données de base, une
normalisation trop poussée peut dans certains cas représenter un obstacle à la gestion
quotidienne des données, notamment parce que l’information est éclatée sur plusieurs
feuilles Excel, qui impliquent à chaque fois l’usage d’identifiant numériques.
Nous conseillons d’utiliser ces macros sur une copie de vos fichiers de travail plutôt que
sur les fichiers originaux, et de ne pas hésiter à continuer à effectuer la gestion de base de
données (insertion de nouvelles données ou modification de données existantes) sur vos
anciens fichiers, éventuellement dénormalisés, si vous vous préférez procéder ainsi.
Les données sous forme normalisées ne doivent pas être vues comme un remplacement
des fichiers d’origines, mais comme un outil supplémentaire à utiliser de façon régulière,
vous permettant de :
-mieux contrôler la qualité des données (faux doublons, variation d’orthographes
dans les noms scientifiques et autres noms),
- générer des check-list de vos noms scientifiques et localités,
-éventuellement préparer la conversion (ou duplication) de vos données vers une
base de données relationnelle
A vrai dire, les cas de figure où données de bases sont stockées de façon continue sous
une forme normalisée se rencontrent principalement dans le cas des bases de données
publiées sur Internet, et/ou dans le cas grandes institutions qui doivent utiliser un même
système informatique pour plusieurs dizaine de millier de spécimens et plusieurs
gestionnaires de collection. La normalisation est aussi intéressante pour des bases de
données liées à des projets qui concernent plusieurs institutions. Pour des collections de
petites tailles ou de taille moyenne, la normalisation peut, à mon sens, être plutôt
envisagée comme une technique supplémentaire permettant d’effectuer des tâches de
contrôle ou de nettoyage de la qualité des données mises en œuvre de façon régulières et
itératives (répétées), ainsi qu’un moyen d’apprentissage des techniques de bases de
données relationnelles liées à la consultation et à l’accès aux données sur Internet.
Notons aussi qu’une compréhension technique de la normalisation est très utile si vous
envisagez de collaborer avec des initiatives internationales comme le GBIF ou Catalog of
Life, Mais par ailleurs il existe depuis environ cinq ans un nouveau type de de bases de
données non relationnelles (dites NoSQL1) et sans intégrité référentielles conçues pour
accéder rapidement sur Internet à de très grands volumes de données sur Internet (on
parle ici de plusieurs dizaines de millions de données).
3 Présentation
La liste des macros proposées dans le fichier est la suivante :
Ces macros effectuent 3 types de tâches :
1
SQL pour « Structured Query Language » (« langage de requête structuré ») est un standard de
programmation apparu il y a un trentaine d’année et partagé par la plupart des bases de données
relationnelles (Microsoft Access, MySQL, PostgreSQL, Oracle etc..). SQL a fortement influencé la
conception d’autres langages informatiques manipulant des donénes. Les différents type de bases de
données SQL accepte cependant le langage sous une forme modifiée par rapport à la nrome, ce qui
empêche de réutiliser facilement les programmes écrit pour un logiciel donné dans un autre modèle de
logiciel, même si la manière de programmer reste très proche dans les différents logiciels. Certaines bases
de données étendent le SQL par des modules spécifiques (prise en compte de calculs géographique,
possibilité d’écrire ds procédures informatiques complexes, etc…). Un grand nombre de logiciels SQL
Open-Source existent : MySQL, MariaDB, PostgreSQL, SQLLite ). « NoSQL » désigne un type de base de
données qui s’éloigne de ce standard, et est plutôt conçu pour les moteurs de recherche sur Internet que
pour la gestion de données.
1-La macro « Normalize» permet de normaliser des données dans des relations « 1 à
plusieurs » :
2-la macro split_and_normalize permet de normaliser des données dans des relations
« plusieurs à plusieurs ».
3 la macro « annuleMacro » a été créé pour revenir en arrière après avoir exécuté
« normalize » mais ne marche pas très bien, je vous déconseille de l’utiliser
4 : la macro « GenerateMySQL » permet, via un système de menus, de générer
automatiquement un fichier pour convertir une feuille Excel en table MySQL. Elle
permet aussi d’importer le contenu de ces données dans la table.
Elle doit être exécutée pour chaque table du classeur.
5 : la macro « GeneratePostgreSQL » effectue la même opération pour PostgreSQL. Il
s’agît d’un autre système de bases de données open-source, plus complexe techniquement
que MySQL, mais qui présente l’intérêt de pouvoir gérer des données géographiques
complexes.
4 la macro « Normalize » (relation « 1 à plusieurs »)
Comme indiqué ci-dessus, la macro « normalise » permer la création d’une relation « un
à plusieurs » dans une normalisation : création d’une nouvelle table avec les valeurs triées
par une clé unique, et pose d’une colonne clé étrangère dans l’ancienne table.
Cette macro permet à l’utilisateur de :
1.1- sélectionner une ou plusieurs colonnes. Ces colonnes doivent être ou bien
uniques, ou bien regroupées de manière à concerner ensemble un même
objet ou un même concept2
2
Ainsi :
-le genre
-l’espèce
- (éventuellement) la famille et les autres taxons supérieurs
peuvent être groupés ensemble car ils relèvent d’un même concept : le nom scientifique. On
pourra ensuite pousser la normalisation plus loin en normalisant à leur tour la famille et les rangs
supérieures et en les séparant des rangs inférieurs, mais cette étape nécessite au préalable de
grouper ensemble et de d’isoler tous les rangs taxonomiques dans une même feuille de données.
C’est la combinaison de tous ces champs qui constitue ce qu’est un nom scientifique.
De même, :
-la latitude,
-la longitude
-la technique de capture des coordonnées (GPS, cartes),
-la projection géographique,
-l’incertitude géographies
Constituent 5 colonnes qui décrivent un même concept ( la position géographique») et peuvent
être normalisées ensembles, avant d’être éventuellement normalisées de manière plus approfondie
1.2- détecter si une même valeur (c’est-à-dire combinaison des valeurs sur une
même ligne) est répétée plusieurs fois.
1.3-créer une nouvelle feuille distincte qui va contenir une seule fois chaque
combinaison de valeurs distincte et lui assigner dans une colonne placée en
première position un numéro unique.
Cette nouvelle feuille correspondra à une nouvelle table dans la base de données
relationnelle, possédant une clé primaire en première position3.
1.4-créer une colonne supplémentaire dans la feuille d’origine, qui est placée
devant les champs normalisés, et qui contient la clé étrangère de la valeur. Elle
établit la correspondance entre la table de départ et la table des valeurs iniques
crée à l’étape précédente
1.5-Finalement, la macro propose un menu qui laisse à l’utilisateur le choix
d’effacer ou non dans la feuille de départ les colonnes qu’il vient de normaliser.
Nous recommandons dans un premier temps de conserver les anciennes colonnes
qui ont été normalisées, de vérifier ensuite si la correspondance entre la colonne
de clé étrangère créée dans la feuille d’origine et la clé primaire de la nouvelle
feuille est correcte, et éventuellement d’effacer ensuite les colonnes de départ.
Le fait d’effacer les colonnes de la feuille de départ après les avoir normalisées se
justifie surtout si vous souhaitez exporter les données dans une base de données
SQL.
ensuite (on pourrait inclure la localité dans certain cas, bien que cela soit discutable : une localité
peut correspondre à plusieurs position).
Mais normaliser ensemble l’espèce et la latitude n’aurait aucun sens, car ce sont deux colonnes qui sont
reliées à deux réalités indépendantes l’une de l’autre.
3
Veuillez noter que les macro Excel génèrent ds numéros identifiant uniques, mais ne pose pas de
contrainte d’unicité sur la colonne. C’est-à-dire qu’elle ne crée rien qui empêche d’utiliser à nouveau une
valeur qui existe déjà. Cette unicité doit être gérée manuellement par l’utilisateur après que la feuille des
valeurs uniques ait été créée et remplie par la macro.
Mode d’emploi
1 : Couper/Coller les données que vous souhaitez normaliser dans la macro.
Il est important que la première ligne du tableau reprenne le nom des colonnes
2) Sélectionnez la ou le groupe de colonnes que vous souhaitez normaliser
-vous pouvez soit prendre la première ligne des colonnes ou non (je recommande
néanmoins de la prendre
-avec la nouvelle version de la macro, il n’est plus nécessaire de limiyer la
sélection à la dernière ligne du fichier (mais il est mieux de le faire)
Exemple avec des colonnes concernant les noms scientifiques (sur plusieurs rangs)
3) Allez sur le menu des macros et exécutez « normalize »
4) Une fenêtre de saisie apparaît dans laquelle vous devez saisir le nom de la feuille qui
va être créée. Cliquez ensiote sur « OK ». Cette feuille doit correspondre à une table d’un
modèle de base de données normalisé. Important : chaque feuille doit avoir un nom
unique dans le fichier Excel
Exemple : « noms_scientifiques »
5.a) la macro demande ensuite si la première ligne de la sélection contient les noms des
colonnes (note : pour des raisosn techniques il est mieux d’inclure la première ligne avec
les noms de colonne dans cette macro , mais pas dans « split_and_nomalize » qui est
détaillée plus bas)
5.b) Si vous avez cliqué sur « non » au menu précédent, la macro demande si les noms
des colonnes sont placés au-dessus de la première ligne de la sélection (afin de nommer
automatiquement les colonnes dans la nouvelle feuille). Cela doit être enf ait le cas
(erreur si les noms de colonens ne sotn aps données)
6) Elle demande ensuite si vous voulez-supprimer les colonnes dans la feuille de départ
-Si oui : les colonnes normalisées seront entièrement remplacées par la clé
étrangère.
-Si non : elles figurent toujours dans la feuille de départ à droite de la clé
étrangère. Les valeurs sont donc présentes deux fois : une fois dans la feuille de départ
(avec répétition), une fois dans la feuille qui va être créée (mais avec un système de
contrôle de l’unicité)
Dans un premier temps je vous conseille de cliquer « non » puis vérifier
manuellement si les numéros de clés correspondent aux mêmes valeurs dans les deux
feuille, quitte à supprimer ensuite manuellement les colonnes de la feuille de départ si
vous le souhaitez.
7) La macro a rajouté une nouvelle feuille au document Excel (ici :
« noms_scientifiques »)
Cette feuille contient une liste uniques des valeurs colonnes qui viennent d’être crées,
assortie d’un numéro unique en première position, nommé par le nom préfixé par « pk_ »
(exemple : « pk_noms_scientifiques »).
L’unicité s’applique sur la combinaison des colonnes s’il y en a plusieurs.
Cette liste unique permet de contrôler plus facilement l’unicité des valeurs, et détecter de
faux doublons liés à des variations d’orthographe. L’image ci-dessous permet par
exemple de repérer que la liste unique contient le nom « Anomale bengalensis » une fois
de trop, sous une forme erronée « Anomale bengalensys » (cette erreur a été introduite
intentionnellement dans un jeu de données pris sur le GBIF pour les besoins de
l’explication).
Trier la liste alphabétiquement permet de repérer plus facilement ces faux doublons.
Leur correction fera l’objet d’un prochain chapitre.
8) Si on revient dans la feuille de départ (dans le cas présent : « spécimens »), on constate
que la macro a ajouté une colonne numérique devant les valeurs normalisées. Il s’agît du
numéro de clé étrangère (correspondant au numéro de clé primaire de la nouvelle feuille,
mais répété si nécessaire)
On peut supprimer les colonnes normalisée de la feuille de départ, et se contenter de la
clé étrangère pour lier le spécimen au nom scientifique, comme ci-dessous :
On obtient ainsi un gain de place, et surtout un mécanisme direct de contrôle de l’unicité
des données qui est un élément important de la vérification de la qualité des données. La
lecture des valeurs est cependant plus malaisée car elle demande de se rapporter aux deux
feuilles pour comparer mes valeurs des clés .Notons que les bases de données SQL
possèdent un mécanisme appelé « vue » (« requête » dans Access) qui permet de
fusionner à l’affichage les deux tables.
9) Les étapes de normalisation à l’aide de la macro peuvent être répétée sur la table qui
vient d’être normalisée (« noms_scientifiques ») : par exemple pour extraire une liste
unique des familles à partir des noms scientifiques.
Feuille résultante est une liste unique des familles.
Note : d’un pint de vue scientifique il aurait mieux valu dans cet exemple normaliser
ensemble la famille avec les rangs qui lui sont supérieurs : ordre et classe, mais cela
aurait généré des documents trop grands pour ce manuel.
La table plus bas montre la clé étrangère de la famille dans les noms
scientifiques (pk_famille):
Notons que le fait d’appliquer un traitement informatique sur des données résultant de
l’application précédente du même traitement est un concept très important et bien
spécifique en informatique : la récursivité. Les structure taxonomiques, du fait de leur
aspect hiérarchique, se prêtent particulièrement bien à l’application de traitement
informatiques récursifs. On peut ainsi considérer que la normalisation de structures
taxonomiques comporte un aspect récursif important, mais qu’il n’est aps possible
d’automatiser complètement du fait de l’importance de l’analyse et de l’interprétation
conduite par la gestionnaire scientifique des donn »es.
Nous avons ainsi vu comment la macro « normalize » permet de construire relativement
facilement une structure normalisée par des relations de type « un à plusieurs » (c'est-àdire abev ube clé étrangère placée directement dans la feuille de départ et diriée vers la
liste unique) à partir d’un fichier Excel.
5) la macro « split_and_normalize » (relation « plusieurs à plusieurs »)
Nous allons maintenant aborder l’utilisation de la macro « split_and_normalize » qui
permet de gérer des relations « plusieurs à plusieurs ». Rappelons qu’elles nécessitent
l’usage d’une table intermédiaire qui recueille les clés étrangères et est placée entre la
feuille de départ et la liste unique
Elle s’applique dans les cas de figure où une colonne peut contenir des listes de valeurs
placée sur la même ligne, par exemple :
Usage
Bois d'œuvre, carbonisation ,
médicinale
Bois d'œuvre ,carbonisation
Bois de coffrage
Carbonisation
Carbonisation
Médicinale , alimentaire
Carbonisation , médicinale
Préalable important : cette macro exige que chaque élément de la colonne soit séparé
par un caractère délimiteur (par exemple la virgule : « , » ou le point-virgule : ; »). Cet
élément doit être le même partout. Cela implique de modifier certaines valeurs qui sont
peut-être écrit sous une forme correcte.
Par exemple
“Bois d'œuvre ,carbonisation et usage médicinal”
Doit être changé avant l’exécution de la macro en :
“Bois d'œuvre ,carbonisation , usage médicinal”
La forme d’origine avec le « et » entre l’avant-dernier élément et le premier relève d’un
français soutenu, mais est malheureusement beaucoup plus difficile à décomposer
informatiquement…
Guide d’utilsation :
1) Sélectionnons la colonne à normaliser
Note: pour cette macro il vaut mieux ne pas reprendre la première ligne
contenant les noms de colonnes mais commencer à la deuxième ligne et étendre la
sélection jusqu’à la fin des valeurs (sinon les noms de colonnes sont inclus dans les
valeurs normalisées)
2) Dans le menu des macros, exécutons “split_and_normalize”
3) Une fenêtre de saisie apparaît pour saisir le nom de la feuille qui va contenir la
liste unique des valeurs
4) Une nouvelle fenêtre de saisie apparaît ensuite pour saisir le caractère qui
sépare les valeurs (par défaut elle propose la virgule, mais ce signe peut être
remplace)
5) Une troisième fenêtre apparaît dans laquelle il faut indiquer la position de la
clé primaire (ou numéro identifiant unique) de la feuille de départ (par défaut
elle propose « 1 » pour indiquer que cette colonne est au début de la feuille,
mais cette valeur peut là aussi être changée si nécessaire)
A la fin du traitement deux nouvelles tables ont été créées :
6) Une feuille avec les valeurs uniques, comme pour la macro précédente (dans
cet exemple la feuille est intitulée « usages »). Notons que la numérotation
commence ici par « 0 »
7) On constate que la feuille de départ n’a pas été modifiée. En revanche une
seconde feuille é été créé, qui contient deux colonnes, et est nommée par le
préfix nn_ (pour « ℕ à ℕ») suivi du nom de la table normalisée (dans notre
exemple : nn_usages).
La première colonne contient la clé primaire de la table de départ, la seconde
colonne la clé primaire de la table qui vient d’être crrée.
On constate que chaque valeur d’une même colonne peut être répétée au sein de
cette colonne, mais que la combinaison des deux valeurs par ligne est unique.
Cette table permet ainsi de représenter le fait que la relation réunit une valeur à
plusieurs valeurs dans les deux directions :
-une espèce peut être l’objet de plusieurs usages
-un même usage peut être pourvu par plusieurs espèces
Nous avons dp,c passé en revue les deux macros qui permettent de générer les
deux types de relations d’un modèle relationnel de données normalisé
6) les macros pour l’importation en SQL
Note : Cette partie de l’activité est facultative et est données pour information,
dans l’éventualité où vous souhaitez vous-mêmes importer vos données dans une
bases SQL Les types de bases supportés par cette macro sont MySQL et
PostgreSQL (deux logiciels open-source facilement téléchargeable, et bien
documentés).
Le fichier contient donc deux macros supplémentaires pour générer du code
d’importation de la table, soit vers MySQL, soit vers PostgreSQL.
6.a) « generateMySQL » (pour MySQL)
6.a.1) Sélectionner dans les onglets la feuille que vous souhaitez importer en SQL
(la amcro est exécutée à chaque la feuille active).
Note :
- la première ligne doit contenir le nom des colonnes,
- la seconde être la première ligne de données
- il ne doit pas y avoir de ligne blanche entre les données (toutes
les lignes avant la dernière doivent au moins contenir un identifiant
unique pouvant servir de clé primaire)
6.a.2) Positionner le curseur dans le coin inférieur droit de la sélection (dernière
case de la dernière ligne ayant des données)
Remontez ensuite la sélection vers le coin supérieur gauche de manière à couvrir
exactement la zone de la feuille contenant des données.
6.a.3) Lancez « generateMySQL »
6.a.4) Une fenêtre de saisie apparaît pour entrer le nom de la table.
Se souvenir des règles des noms de tables en SQL :
- les virgules et signe de ponctuation ne peuvent pas être présents
- éviter les espaces (au besoin les remplacer par « _ »)
- éviter les lettres avec des signes diacritiques (accents ou cédille), les
remplacer par la lettre sans accent
-de préférence n’utiliser que des minuscules (facilité de
programmation)
-il est recommandé de mettre les noms de tables au pluriel (uen tbale
regroupe en effet une collection d’objets du même type)
6.a.5) plusieurs menus apparaissent pour renommer les colonnes et spécifier leur
nomd ans SQL. Là aussi les mêmes règles s’appliquent que pour les noms de
tables, excepté le fait quen par convention, il est mieux de laisser les colonnes au
singulier pour les distinguer des tables. En effet elles sont souvent lues à partir
d’une ligne pour indiquer la propriété d’un seul objet.
La colonne «Numéro» doit donc être rebaptisée «numero» .
Attention, les noms longs sont descriptifs, mais il est plus commode de
programmer avec des noms courts (car chaque noms doit être souvent répété
plusieurs fois dans du code). Essayez de trouver un bon compromis entre
concision et expressivité du nom…
=>
6.a.6) Choisissez ensuite le type de la colonne
Note :
-le type « Date » n’est pas fonctionnel : encodez les dates comme du texte
-une erreur (type de colonne ne correspondant pas au cotenu réel des
lignes) peut provoquer une erreur lors de la création de la table SQL. Il faut alors
détruire la table SQL et recommencer le processus pour la table. Cette erreur se
prduit particulièrement quand une colonne est déclarée dans un type numérique
mais contient en fait des lignes avec du texte. Faites particulièrement aux
indications textuelles qui précisent qu’une valeur n’existe pas, comme « ind. » ou
« inconnu ». Il vaut mieux alors laisser la cellule complètement vide (attention :
ne pas laisser d’espace) avant de réaliser l’importation
6.a.7) Le processus se répète pour chaque colonne. Lorsque la dernière colonne a
été passée en revue, l’application vous propsoe de crrée un fichier qui contiendra
la code SQL, et de le sauver
6.a8) répétez le processus pour les autres tables
Sauvegarder le fichier . Rajoutez-lui manuellement une extension « .sql » ou
« .txt » à la fin du nom
Le fichier devrait être visible dans votre système de fichier.
Il contient du code qui peut être chargé dans MySQL pour générer une table.
Notez que ce code crée les tables SQL mais ne pose pas automatiquement les
contraintes (clés primaires, clés étrangères, indexes). Ces contraintes doivent
être rajoutées manuellement après l’insertion.
La macro « generatePostgreSQL » fonctionne de la même manière que la macro
MySQL, mais génère du code pour l’insertion des données dans PostgreSQL (il
existe de légères différences dans la syntaxe du langage SQL des deux bases de
donénes qui empêche d’utlsier un même script dans les deux cas).
L’insertion du script dans MySQL n’est pas détaillée dans ce chapitre, mais est
assez facile en utilisant l’outil PHPMyAdmin (pour des volumes de données
petites ou moyen). N’hésitez pas à me contacter si vous souhaitez plus de
précisions à ce sujet.