OpenRefine, nettoyage de bases de données avant import dans Ishtar

Lors des formations Ishtar, je cite voire présente souvent le logiciel libre OpenRefine, pour vérifier, harmoniser et nettoyer en masse les données que vous pouvez recevoir de bases de données externes avant de les importer dans votre instance Ishtar. Voici des informations supplémentaires pour aller plus loin.

Téléchargement

Pour le télécharger, cela se passe sur le site officiel ; la page est en anglais mais le logiciel est bien traduit en français.

Tutoriels en français

Pour me former en 2017, j’avais surtout lu des tutoriels en anglais, mais je m’étais aussi appuyée sur le formidable tutoriel pense-bête OpenRefine, « Excel aux hormones » pour nettoyage de données, sur Patrimoine et Numérique.

Il existe également les tutoriels vidéo d’Ettore Rizza.

En préparant ce message, je découvre un tutoriel très récent - novembre 2020 - et très complet qui me semble le meilleur lien à vous pointer : Tutoriel OpenRefine 3.4 : nettoyer, préparer et transformer des données, par Mathieu Saby.
Il semble en outre être utilisé lors des formations du consortium MASA (Mémoire des Archéologues et des Sites Archéologiques), donc a priori particulièrement adapté aux archéos.

Et pour se plonger plus rapidement dans le sujet (notamment répondre dès la diapo 3 à la question « que peut faire OpenRefine pour mes données ? »), une introduction très efficace en diaporama : Atelier OpenRefine, Nettoyer et enrichir des données avec OpenRefine, par Maïwenn Bourdic.

Bonne découverte !

Pense-bête Iggdrasil

De mon côté, je partage avec vous ci-dessous les formules qui me servent plus ou moins régulièrement et que j’ai notées dans mon propre pense-bête.

Vérifications

Comparer les valeurs de deux colonnes / vérifier que deux colonnes A et B sont identiques (ou pas)

Colonne A > Facette > Personnaliser la facette textuelle > value == cells["colonne B"].value

Vérifier que des dates sont cohérentes

  • Copier la colonne (la transformation en date donne un format non valable pour Ishtar) : Éditer la colonne > Ajouter une colonne en fonction de cette colonne > value
  • Sur la colonne copie, convertir en date : Éditer les cellules > Transformations courantes > En date
  • Facette > Facette chronologique ou Facette textuelle permettent de repérer les occurrences non conformes (année 0214 au lieu de 2014, etc.).

Faire une jointure entre deux tables

Sur colonne pivot du projet qui reçoit la jointure : Éditer la colonne > Ajouter une colonne en fonction de cette colonne > cell.cross("nom projet 2","colonne commune").cells["colonne à joindre"].value[0]

Formules de transformation ou d’extraction de données

La plupart des formules suivantes peuvent s’utiliser autant pour modifier une donnée (Colonne concernée > Éditer les cellules > Transformer) que pour extraire de nouvelles données (Colonne concernée > Éditer la colonne > Ajouter une colonne en fonction de cette colonne)

Remplacer une chaîne de caractères par une autre

value.replace("UnMot","UnAutre")

Copier les valeurs de la colonne B dans la colonne A

  • en écrasant : cells["colonne B"].value

  • en ajoutant à l’existant : value + " " + cells["colonne B"].value

Passer uniquement la première lettre en majuscule (passer toutes les premières lettres en majuscule est accessible dans Transformations courantes > En initiales majuscules)

toUppercase(value.get(0)) + value.slice(1)

Supprimer les espaces de début et de fin

value.trim()

Accessible également via Éditer les cellules > Transformations courantes > Supprimer les espaces de début et de fin

Rassembler les espaces consécutifs

value.replace(/\s+/," ")

Accessible également via Éditer les cellules > Transformations courantes > Rassembler les espaces consécutifs

Numéro de la ligne

row.index + 1

Longueur d’une chaîne de caractères :

value.trim().length()

Supprimer les 5 premiers caractères

value.substring(5)

Conserver les caractères 5 à 10

value.substring(4,10)

Conserver les caractères après le 10 inclus

value.substring(9,end)

Ne conserver que le premier mot d’une colonne

smartSplit(value," ")[0]

Peut par exemple servir pour extraire le nom d’une personne dans un champ Nom Prénom (ne fonctionne pas avec les cas particuliers, fait gagner du temps pour la majorité)

Ne conserver que le dernier mot d’une colonne

smartSplit(value," ")[-1]

Peut par exemple servir pour extraire le prénom d’une personne dans un champ Nom Prénom

Pour séparer une colonne Nom Prénom de ce type en deux colonnes Nom et Prénom, en version plus robuste

  • Récupérer le prénom (= dernier mot)
    • Éditer la colonne > Ajouter une colonne en fonction de cette colonne (Prénom) > smartSplit(value," ")[-1]
  • Récupérer le nom (= tout le reste du contenu de la cellule)
    • Éditer la colonne > Ajouter une colonne en fonction de cette colonne (Nom) > value.substring(0,value.trim().length() - cells["Prénom"].value.trim().length() - 1)

Cela ne traite toujours pas tous les cas, on a ainsi une gestion des noms multiples ou à particule, mais cela ne gère pas les prénoms composés écrits sans tiret… À nettoyer avec la liste des facettes.

Majuscule à la première lettre du second prénom dans un prénom composé (Jean-claude → Jean-Claude)

Après avoir sélectionné (Filtrer le texte) les occurrences avec tiret :

value.slice(0, indexOf(value, "-") + 1) + toUppercase(value.get(indexOf(value, "-") + 1)) + value.slice(indexOf(value, "-") + 2)

Extraire une année (= 4 chiffres consécutifs) au sein d’un texte

value.match(/.*(\d{4}).*/)[0]

Ajouter des zéros initiaux

Par exemple pour un nombre à 4 chiffres :
"0000"[0,4-value.length()] + value

Corriger des numéro INSEE dont le zéro initial a sauté

  • Convertir la colonne en texte Éditer les cellules > Transformations courantes > En texte
  • Calculer longueur de la chaîne de caractères dans une autre colonne value.trim().length()
  • Pour les lignes pour lesquelles cette longueur vaut 4, Éditer les cellules > Transformer > "0" + value

Convertir un texte en son identifiant textuel (tout en minuscules, pas d’accent, signes typographiques [espaces, virgules, parenthèses] remplacés par des tirets)

value.replace(/[éèêë]/,"e").replace(/[àâ]/,"a").replace(/[îï]/,"i").replace(/[ûüù]/,"u").replace("ô","o").replace("ç","c").replace(/[ ,()]/,"-").replace("--","-").toLowercase()

Notamment pour préparer de longues listes de valeur pour import dans les typologies Ishtar.

2 « J'aime »

Bonjour
Merci Valérie-Emma. J’ajouterai qu’il permet aussi de faire les même manip sur d’autres projets, ce qui est très utile (et un gain de temps) lorsqu’on part de tableaux identiques pour les importer.

1 « J'aime »