6 Transformations avancées
6.1 Initiation au langage GREL
Pendant quelques secondes, une information s’affiche après une modification des données réalisée via le menu. Elle indique la formule utilisée par OpenRefine.
Ex:
Ces formules se retrouvent aussi dans l’historique des traitements.
Les transformations personnalisées, la création de nouvelles colonnes, et les facettes personnalisées reposent sur des formules de ce type, saisies manuellement.
Elles utilisent soit le langage GREL (Google Refine Expression Language, ou General Refine Expression Language), soit Python (dans sa version compilée en Java Jython) soit Clojure.
Les expressions GREL sont saisies dans un écran d’édition accessible par différent menus :
- Colonne Toutes >
L’écran permet de prévisualiser les résultats. Trois onglets peuvent être utiles : aide, historique, commandes favorites
Syntaxe de base :
- une fonction GREL :
nomFonction(parametre)
ouparametre.nomFonction
- plusieurs fonctions GREL à la suite :
parametre.nomFonction1.nomFonction2
- valeur de la colonne en cours :
value
- valeur d’une autre colonne colonne :
cells.NOMDECOLONNE.value
oucells[NOMDECOLONNE]value
Pour la suite du cours, il peut être nécessaire de recourir à la documentation officielle (https://github.com/OpenRefine/OpenRefine/wiki/General-Refine-Expression-Language) et à ces essais de documentation personnelles en français :
- Structure de données et langage GREL : version Word, PDF et html
- Analyse de HTML et XML : version Word, PDF et html
- Analyse de JSON : version Word, PDF et html
- Expressions régulières : version Word, PDF et html
- Utilisation de Jython ; version Word, PDF et html
Activité
Téléchargez la feuille d’exercices exo1_GREL en version Word ou PDF et répondez aux questions (20-30 minutes)
Quelle formule à appliquer à la colonne cote permettrait de concaténer la cote et la date ?
- Réponse
value+cells.date.value
Faites une “facette textuelle personnalisée” sur la colonne sujets et appliquez une formule pour distinguer chaque sujet, en tenant compte du séparateur utilisé). Quelles sont les corrections possibles pour harmoniser les sujets ?
- Réponse
value.split(“;”)
Faites une autre facette personnalisée sur la colonne date avec la formule suivante :
isNotNull(value.match(
/([0-9]{4}.[0-9]{2}.[0-9]{2})/
))
Quel est son utilité ? Comment fonctionne-t-elle ?
- Réponse
Permet d’isoler les dates ne correspondant pas au format AAAA-MM-JJ ni à AAAA/MM/JJ : il reste des dates au format JJ mois AAAA
match(/(expression)/) : confronte les valeurs à une expression régulière et capture la partie de la valeur correspondant aux parenthèses ; renvoie un tableau ou null si la valeur ne correspond pas. isNotNull renvoie false si son paramètre est null, true sinon.
6.2 Restructurer des données multivaluées
Besoin fréquent : passer de plusieurs valeurs par cellule à une seule, et réciproquement.
Axe horizontal (créer de nouvelles colonnes)
Axe vertical (créer de nouvelles lignes)
6.2.1 Axe vertical : créer et supprimer de nouvelles lignes
Eclater des cellules sur plusieurs lignes permet
- de compter les valeurs distinctes (facettes)
- de les harmoniser
- de les transformer ou combiner avec d’autres colonnes
- de les aligner avec des référentiels extérieurs
Activité
Normalisation des sujets
Normalisez les sujets utilisés dans la colonne sujet : passez tout en minuscule avec majuscules accentuées, supprimez le mot archéologie, ordonnez les mots restant par ordre alphabétique
- Création de nouvelles lignes
Menu
Choisir le mode de séparation : séparateur (ponctuation, mot, valeur spéciale (“\n”, “\t” …), expression régulière) ou nombre de caractères par champ.
Grouper et éditer
Transformer en initiales majuscules
Facette pour contrôler le résultat
A partir de la facette, supprimer Archéologie
passser en mode entrées
Joindre les cellules multivaluées en utilisant le nouveau séparateur
|
:
Menu
- Transformer avec la formule personnalisée
value.split("|").sort().join("|")
Normalisation des dates
Que la date soit de forme AAAA/MM/JJ ou JJ/MM/AAAA, transformer en AAAA-MM-JJ.
Plusieurs techniques sont possibles.
A. Préalable : séparer chaque composant des dates sur plusieurs lignes et les harmoniser
Créer 3 lignes par date (jour, mois, année) puis nettoyer les mois et reconstituer les dates normalisées.
- Création des nouvelles lignes
Prendre en compte les différents séparateurs utilisés pour séparer les composantes des dates : expression régulière [ \/]
- Nettoyage
Faire une facette textuelle et remplacer les noms des mois par leur numéro.
Rajoutez un 0 devant les numéros de jours si besoin : soit en éditant les facettes soit en utilisant le menu ([0-9])
et remplacer par 0$0
)
Résultat :
B. 1re option : utiliser une formule
Refusionner les composants en 1 seule ligne avec le séparateur “-” puis utiliser une formule GREL : if(value.match(/([0-9]{2}-[0-9]{2}-[0-9]{4})/).length()==1,split(value,"-").reverse.join("-"),value)
B. 2e option : créer de nouvelles lignes et exploiter les entrées
La formule GREL row.record.cells.NOMDECOLONNE.value
permet d’obtenir pour chaque entrée un tableau de toutes les valeurs d’une colonne.
Dans la colonne date, prévisualiser la transformation row.record.cells.date.value
, puis row.record.cells.cote.value
Ce tableau peut ensuite être manipulé avec d’autres fonctions. Ex : row.record.cells.NOMDECOLONNE.value.uniques().sort().join("|")
: Pour chaque entrée, supprime les doublons dans les valeurs des cellules de NOMDECOLONNE, les trie par ordre alphabétique et les exporte sous forme de chaîne avec un séparateur |
.
Etapes :
- Traiter les dates de forme JJ/MM/AAAA
- Se mettre en mode lignes
- Isoler les 1er élément de chaque date : Facette par valeur vide sur la colonne cote ; afficher les cellules non vides
- Isoler les 1ers éléments de chaque date dont la longueur est 2 : Facette par longueur sur la colonne date ; afficher les valeurs de longueur 2
- Créer une chaîne AAAA-MM-JJ dans chaque ligne des entrées sélectionnées, en inversant l’ordre initial :
row.record.cells.date.value.reverse().join("-")
- Traiter les dates de forme AAAA/MM/JJ
- Conserver la facette sur les cotes, mais modifier la facette sur la longueur des dates : afficher les éléments de date de longueur 4
- Créer une chaîne AAAA-MM-JJ dans chaque ligne des entrées sélectionnées :
row.record.cells.date.value.join("-")
- Nettoyer les lignes inutiles
- supprimer toutes les facettes sauf celle sur la cote
- inverser la facette pour afficher les lignes où la cote est vide
- supprimer toutes ces lignes
Créer une ligne par fichier
Remplacer les cellules vides par une valeur fictive dans toutes les colonnes : Toutes > Transformer :
value.coalesce('').replace(/^$/,'####')
Eclater la colonne fichier et page sur plusieurs lignes
Déplacer la colonne en 1re position
Remplir les cellules vides créées par l’opération dans les autres colonnes
Nettoyer les valeurs fictives : Toutes > Transformer :
value.replace('####','')
6.2.2 Axe horizontal : créer et supprimer de nouvelles colonnes
Séparer les information “nom de fichier” et “page” de la colonne “fichier et page” dans deux colonnes
Plusieurs techniques possibles :
- Menu
- Diviser en plusieurs colonnes
Choisir le séparateur “(”, décocher “deviner le type de cellule”
Renommer les colonnes obtenues: fichier et page
Supprimer les caractères non numériques dans la colonne Page
Supprimer le préfixe “file:” et “fichier:” dans la colonne Fichier
ou bien :
- Menu
- Ajouter une colonne. Nom : fichier
Formule : value.split (“(”)[0]
Ajouter une colonne. Nom : page
Formule : value.split (“(”)[1]
Nettoyage identique
6.3 Modifier la colonne “page” pour qu’elle devienne une colonne “titre”
contenu attendu : “[Lettre de De La Croix à Espérandieu du XX mois XXXX], page X”
Créer 3 colonnes pour les jours, mois et années
On a besoin d’utiliser des composants de la colonne date. Le plus simple est de créer temporairement 3 nouvelles colonnes annee, mois, jour, en conservant la colonne d’origine. 2 possibilités, comme plus haut.
Puis à partir de la colonne page :
Menu
- Réponse
Formule :
"[Lettre de "+cells.auteur.value+" à "+cells.destinataire.value+" du "+cells.jour.value+"/"+cells.mois.value+"/"+cells.annee.value+"] p."+value
Supprimer les colonnes jour, mois, années devenues inutiles
Renommer la colonne page en titre
6.4 Transposer des lignes en colonnes
Pas utile dans notre exemple…
- Passer d’un format « large » à un format « long »
(avec 2 nouvelles colonnes)
- Passer d’un format « long » à un format « large »
- Transposer les cellules en colonnes séparées