# OpenRefine/Nettoyage des données

* Introduction
* Installation
* Interfaces
* Import des données
* Analyse des données
* Nettoyage des données
* Réconciliation et enrichissement
* Export des données
* Publication sur Wikidata
* Voir aussi
* Annexe 1 : video détaillées
* Introduction
* Installation
* Interfaces
* Import des données
* Analyse des données
* Nettoyage des données
* Réconciliation et enrichissement
* Export des données
* Publication sur Wikidata
* Voir aussi
* Annexe 1 : video détaillées
[ Modifier le sommaire ]
Une fois l'analyse des données effectuées, on peut se lancer dans le nettoyage de celles-ci.
Il existe au moins deux manières principales de nettoyer des données : travailler individuellement sur chacune de celles-ci ou de faire des modifications en masse. OpenRefine permet les deux mais évidemment son principal avantage réside dans les transformations de masse.

## Modifications individuelles

Chaque cellule du tableur affiché dans OpenRefine peut être modifiée individuellement. Cela est aussi possible sur les facettes elles-mêmes.

### Ligne

Ajouter une ligne dans OpenRefine c'est possible.
* Choisir la colonne dans laquelle se trouve l'information à répartir sur deux lignes;
* Puis "Éditer les cellules"->"Diviser les cellules multivariées"
* Définir le type de séparateur qui opérera la séparation.

## Journal des actions

OpenRefine offre dans la zone de gauche de l'interface de traitement des données un journal des actions et transformations opérées. Cela permet de revenir en tout temps en arrière, y compris jusqu'à la première action.
Ce journal des actions peut aussi être exporté (via "Extraire") afin de pouvoir être rejoué (via "Appliquer") tel quel sur un nouveau ensemble de données. Cette fonctionnalité est très pratique si on travaille sur plusieurs fichiers similaires ou sur plusieurs versions d'un même fichier (par exemple fichier mis à jour régulièrement).

## Modifications en masse
### Groupe

À partir d'une liste de termes obtenus par la demande d'une facette, ou simplement en choisissant Éditer les cellules->Grouper et éditer, OpenRefine offre une proportion de regroupement des valeurs par similitude. À partir de cette visualisation, il est possible de procéder à des fusions de termes sous une même valeur. Voir à ce sujet la vidéo n°1 d'introduction de 2011.

## Chaînes de caractères

Il existe de nombreuses fonctions GREL pour manipuler les chaînes de caractères :
* pour les découper (trim(c) strip(c) chomp(c1, c2) substring(c, 0, 10) split(c1, c2)),
* pour changer la casse (toLowercase(c) toUppercase(c) toTitlecase(c)),
* pour calculer ou compter la chaîne (length(c) contains(c1, c2)),
* etc.

## Dates
### Typer une colonne en date

Transformer le format d'une colonne en date (de type aaaa-mm-jjT00:00:00Z, soit jusqu'à l'heure !) permet d'utiliser la facette chronologique, et donc la jauge temporelle.
Pour ce faire : Clic sur la colonne -> Éditer les cellules -> Transformations courantes -> En date.
Un conseil : dupliquer la colonne date pour faire la manipulation sur un double...
Source : le blog de Maïwenn Bourdic.

### Changer le type de date

Clic sur la colonne -> Éditer les cellules -> Transformer -> la commande GREL :
value.toDate('yyyy-MM-dd','MMM-yy').toString('dd-MM-yyyy')
Source : le blog de Maïwenn Bourdic.

## GREL

GREL est un acronyme qui signifie General Refine Expression Language.
Voir la documentation officielle et aussi le mémo de Mathieu Saby

### La base

* Les formules GREL ne commence pas par un signe = contrairement à celles des tableurs habituels.
* La formule n'est pas stockée dans la cellule. C'est le résultat qui l'est.
* value appelle la valeur de la colonne d'où est partie la requête.
* cells['nom de la colonne'] ou cells.nom_colonne permet d'appeler n'importe quel valeur sur une autre colonne.
* les transformations peuvent être enchaînées par un point.
* les transformations peuvent encapsulées par des parenthèses (seule possibilité pour les transformations conditionnelles).
Tiré en partie du mémo de Mathieu Saby,

### Transformations primaires

Comme le dit Mathieu Saby dans son mémo, Les formules GREL permette de réaliser les opérations simples comme :
* concaténer des valeurs : "a"+"b"->ab
* calculer sur les nombres grâce aux opérateurs + - / *: 1+2->3
* comparer grâce aux opérateur : ==,!==,<,>,=>,<=

### Transformations directes

Mathieu Saby distingue les formules GREL de fonction et celles de contrôle, nous les avons distingué ici entre celles de transformations directes et celles de transformations conditionnelles, recoupant plus ou moins la même distinction.

#### premier modèle

Le premier modèle s'écrit fonction(paramètres).
* forEach(value.split("-"), v, v.toTitlecase).join("-") pour appliquer une majuscule sur les initiales à un nom composé, par exemple : nadine-josette.
* value.substring(0,1) qui signifie reprendre la valeur depuis la première lettre (position 0) en enlevant celles depuis la seconde lettre (position 1).
* value.substring(31) : on enlève les 31 premiers signes.
* value + " " + cells["nom de la colonne"].value permet de concaténer les valeurs de deux colonnes dans une troisième.
* cells["nom de la colonne"].value (exemple : value+" "+cells["Person_1 1"].value)

#### second modèle

Le second modèle s'écrit Paramètre1.fonction(Paramètre2).
* value.log.
* value.parseJson.responseData.language.
* value.replace("quelque chose","par quelque chose d'autre")>.
** value.replace(value,"par quelque chose d'autre") permet de créer une nouvelle colonne en fonction d'une existante avec une valeur nouvelle.
** value.replace(/\n/, " | ") remplace (via REGEX) les retours à la ligne par un pipe (à vérifier).
* value.substring(2) qui signifie reprendre tous les caractères moins ceux ayant les deux premières positions.
* value.toDate('yyyy-MM-dd','MMM-yy').toString('dd-MM-yyyy') pour changer le type de date.

### Transformations conditionnelles

* if(cells["titre d'une autre colonne"].value, value + "un texte", value) qui nécessite que l'autre colonne dispose de valeur de requête vrai ou faux. Si c'est le cas alors on peut utiliser if (si) le valeur est vraie alors ajoute au texte existant un texte, sinon on laisse la valeur telle quelle.
* if(isBlank(cells["colonne 1"].value), " - ", cells["colonne 1"].value) + " - " + if(isBlank(cells["colonne 2"].value), " - ", cells["colonne 2"].value) + " - " + if(isBlank(cells["colonne 3"].value), " - ", cells["colonne 3"].value) + " - " + if(isBlank(cells["colonne 4"].value), " - ", cells["colonne 4"].value) pour concatener le contenu de 4 colonnes dont certaines ne disposent pas de valeur.
* "film de "+if(isBlank(cells["Réal1"].value), " ", cells["Réal1"].value) + if(isBlank(cells["Réal2"].value), "", ", "+cells["Réal2"].value) + if(isBlank(cells["Réal3"].value), "", ", "+cells["Réal3"].value)+ if(isBlank(cells["Réal4"].value), "", ", "+cells["Réal4"].value)+ if(isBlank(cells["Réal5"].value), "", ", "+cells["Réal5"].value)+ if(isBlank(cells["Réal6"].value), "", ", "+cells["Réal6"].value)+ if(isBlank(cells["Réal7"].value), "", ", "+cells["Réal7"].value)
* not(value.startsWith("quelque chose")).
* with(value.parseJson[0],pair, pair.lat + ',' + pair.lon).
* filter
* forEach
* forEachIndex
* forRange
* IsBlank
* IsNonBlank
* IsNull
* IsNotNull
* IsNumeric
* IsError
* forNonBlank

## Références

* ↑ Maïwenn Bourdic, « Typer une colonne en date », sur https://www.patrimoine-et-numerique.fr, 12 avril 2017 (consulté le 6 décembre 2019).
* 1 2 Maïwenn Bourdic, « Changer le type de date », sur https://www.patrimoine-et-numerique.fr, 12 avril 2017 (consulté le 7 décembre 2019).
* 1 2 3 4 5 6 Mathieu Saby, « Programmer dans Openrefine avec GREL », sur https://fr.slideshare.net, 24 novembre 2019 (consulté le 11 février 2020).
* ↑ Merci à Ettore Rizza de nous avoir fourni l'expression.
* ↑ (en) Illionois University Library, « Combining Cell Values », sur https://guides.library.illinois.edu/openrefine, 5 février 2018 (consulté le 28 janvier 2020).
* 1 2 Voir video 1 de 2011
* 1 2 Voir video 3 de 2011
* 1 2 3 Voir video 2 de 2011
* ↑ Maïwenn Bourdic, « Concatener », 12 avril 2017 (consulté le 28 janvier 2020).