je viens de créer mon premier document grist à partir de données Excel et j’aurais aimé nettoyer ces données dans Grist.
Le document en question décrit des spectacles et les personnes qui y participent. J’ai en particulier les deux tables suivantes :
@grist.UserTable classActeurices:
role = grist.Text()
representation_id = grist.Reference(‹ Representations ›)
nom = grist.Reference(‹ Autorites ›)
classAutorites:
nom = grist.Text()
Le problème est que bien entendu j’ai dans ma table autorites des doublons liés à des erreurs de saisie dans mon fichier initial et que j’aimerais donc nettoyer tout ça.
Si par exemple j’ai deux autorités : Jean Dupont et Jea Dupont, quelle est la meilleure solution pour dédoubler ces deux autorités et faire en sorte que toutes les entrées de table Acteurices pointent vers l’autorité conservée ?
Bonjour le souci avec les noms c’est qu’il peut y avoir des homonymes, 2 “Jean dupont” inscrits par ex. Il vaut mieux utiliser une clé unique comme le mail pour faire vos références.
Bonjour @audezu,
merci pour ce retour. Dans un monde idéal en effet mes autorités seraient de vraies autorités mais dans le contexte actuel la base grist que je suis en train de constituer est issue d’un fichier d’inventaire PDF d’un fonds d’archive et les seules infos pour les personnes sont leur nom et leur prénom. Donc pour le moment et dans mon contexte, Jean Dupont et Jean Dupont sont une seule et même personne, même dans les faits cela peut en effet être deux personnes différentes.
J’avais lu le post en lien mais en me disant qu’il y avait surement une solution plus simple. Je n’en ai pas trouvé pour le moment mais j’ai une piste en me basant sur cela. Si je prends le fichier test en PJ ( Test dédoublonnage.grist (168 Ko) ) qui simule ce que j’ai, à savoir une table d’oeuvres et une table de personnes.
Au départ dans mon fichier j’ai dans la table Auteurs deux lignes qui font doublon, Freida Mcfadden et Freida Mcfaden.
L’idée telle que je la vois actuellement serait :
de passer en revue la table Auteurs pour identifier les doublons. Quand c’est le cas, remplacer dans Nom/Prénom la graphie erronée par la forme correcte. Quand c’est fait, la ligne passe en rouge, la colonne doublon est alimentée, et la colonne Auteur de référence prend la valeur de l’auteur qui est celui qui doit resté dans la base.
une fois que c’est fait, sur la table livres, les lignes liées à des auteurs voués à disparaitre passent en rouge et la colonne Auteur redirigé prend la valeur de l’auteur cible que l’on doit conserver. Je peux alors modifier manuellement la colonne Auteur original et utiliser la bonne valeur.
Une fois que c’est fait, j’ai des lignes dans Auteurs qui ne sont plus reliées à rien (Nb Livres == 0) et que je peux donc supprimer
Donc on va dire que ça fonctionne mais je trouve le process un peu complexe et j’imagine qu’il est améliorable mais pour le moment je bloque un peu, si quelqu’un a une idée je suis preneur (et sinon ce pas à pas permettra déjà à quelqu’un qui tombe dessus de nettoyer un peu un fichier).
Je comprends ! Pour gagner du temps dans votre process vous pourriez éventuellement :
ajouter à votre table Auteurs une col booléen “Noms à vérifier“ avec une formule pour retourner vrai (ou le nom similaire) si les noms sont très proches “Jean Dupont”/”Jea Dupont” (avec un seuil par ex de 90%) - vous pourrez ainsi filtrer la table sur cette colonne (vous pourriez avoir une formule qui remplace directement Jea Dupont par Jean Dupont mais elle risquerait de remplacer aussi Léa Dupont par Jean Dupont..ça dépend d’où vous souhaitez mettre le seuil)
ex :
from collections import Counter
names = Table1.lookupRecords().A
# Nom de l’enregistrement actuel (en minuscules pour une comparaison insensible à la casse)
current_name = $A.lower()
# Vérifier s’il existe d’autres enregistrements avec un nom similaire
for name in names:
name_lower = name.lower()
ca, cb = Counter(name_lower), Counter(current_name)
communs = sum((ca & cb).values())
total = max(len(name_lower), len(current_name))
if total == 0 or communs / total >= 0.9 and name_lower != current_name:
return name
« »
Dans la table Livres, créer la référence vers Auteurs uniquement après avoir fait le nettoyage de la table Auteurs (ou si c’est déjà une réf, vous la typez Texte puis la retypez Référence), ce qui vous évite d’avoir à manuellement modifier la valeur