La réponse de Jilles est géniale et vient de l'expérience. J'ai également dû travailler sur le nettoyage de grandes tables désordonnées et malheureusement je ne savais pas grand-chose de mes options à ce moment-là (j'ai fini par utiliser Excel et beaucoup de filtres automatiques). J'aurais aimé connaître OpenRefine.
Mais si vous en arrivez au point où vous devez écrire du code personnalisé pour cela, je voudrais faire une suggestion sur la façon dont: Les colonnes sont toujours les mêmes, n'est-ce pas? Par exemple, la première chaîne est toujours la clé, la seconde est le prénom, le sixième est le code postal, dixième est le numéro de télécopie, etc.
En supposant qu'il n'y a pas un nombre déraisonnable de champs, je commencerais par un type d'enregistrement personnalisé qui a chaque champ de DB comme membre plutôt que comme une position dans un tableau. Quelque chose comme
class CustomerRow {
public final String id;
public final String firstName;
// ...
public CustomerRow(String[] data) {
id = data[0];
// ...
}
Vous pourriez également inclure un code de validation dans le constructeur, si vous saviez qu'il y ait des valeurs de déchets que vous voulez toujours filtrer.
(Notez que vous faites essentiellement ce que l'ORM ferait automatiquement, mais commencer avec un serait probablement plus de travail que simplement écrire le type d'enregistrement.) Puis
vous feriez mettre en œuvre certaines Comparator<CustomerRow>
s qui ne regardez que des champs particuliers, ou définissez l'égalité en termes flous (là où les algorithmes de distance d'édition seraient utiles), ou faites des tris spéciaux.
Java utilise un tri stable pour les objets, donc trier par ex. nom, puis adresse, puis touchez, vous feriez chaque type, mais choisissez vos comparateurs dans l'ordre inverse.
Aussi, si vous avez accès à la base de données actuelle, et qu'il s'agit d'une véritable base de données relationnelle, je vous recommande de faire certaines de vos recherches en tant que requêtes si possible. Et si vous avez besoin d'aller et venir entre vos objets Java et la base de données, l'utilisation d'un ORM peut s'avérer être une bonne option.
Modifiez les algorithmes Distance tels que Levenshtein Distance ou Hamming Distance et éventuellement leurs dérivations. – Brandon
Lucerne et Solr sont écrits en Java et comprennent des outils pour l'appariement flou, entre autres choses. –
Levenshtein ne va travailler que sur une corde? Pas un ensemble de chaînes? – Kong