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 :

  • Editer les cellules > Transformer
  • Editer la colonne > Ajouter une colonne en fonction de cette colonne
  • Facettes > Personnaliser la facette textuelle/numérique
  • Colonne Toutes > Transformer

Ecran de saisie

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) ou parametre.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 ou cells[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 :

Activité

Téléchargez la feuille d’exercices exo1_GREL en version Word ou PDF et répondez aux questions (20-30 minutes)

Correction

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)

Restructuration sur l’axe horizontal

Axe vertical (créer de nouvelles lignes)

Restructuration sur l’axe vertical

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 Editer les cellules > Diviser les cellules multivaluées

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 Editer les cellules > Joindre les cellules multivaluées

  • 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 Editer la cellule > Remplacer (Cocher “expression régulière” et “mot entier”, rechercher ([0-9]) et remplacer par 0$0)

Résultat :

dates éclatées et corrigées

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 :

  1. Menu Editer la colonne > Diviser en plusieurs colonnes
    • 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 :

  1. Menu Editer la colonne > Ajouter une colonne en fonction de cette colonne
    • 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 Editer les cellule > Transformer

    • 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 »

Transposer > Transposer les cellules de plusieurs colonnes en ligne (avec 2 nouvelles colonnes)

Passer d’un format « large » à un format « long »

  • Passer d’un format « long » à un format « large »

Transposer > Convertir en liste les colonnes de clé/valeur

Passer d’un format « long » à un format « large »

  • Transposer les cellules en colonnes séparées

Transposer > Transposer les cellules en colonnes séparées

Transposer les cellules en colonnes séparées