MetaDapper : le mappage et la conversion des données simplifiés avec les bons outils

Publié: 2022-03-11

La conversion, la traduction et la cartographie des données ne sont en aucun cas sorcier, mais c'est certainement fastidieux. Même une simple tâche de conversion de données (par exemple, lire un fichier CSV dans une liste d'instances de classe) peut nécessiter une quantité non négligeable de code. Bien que toutes ces tâches aient beaucoup en commun, elles sont toutes « juste assez différentes » pour nécessiter leurs propres méthodes de conversion de données.

Dans pratiquement tous les systèmes que nous construisons, nous aurons à un moment donné besoin de transformer des données d'un formulaire à un autre, que ce soit pour importer des données à partir d'un magasin de données existant, traiter des données à partir d'un flux entrant, traduire d'un format à un autre pour des traitement ou transformation des données dans un format de sortie souhaité.

Et chaque fois que nous le faisons, la tâche semble si frustrante similaire à ce que nous avons fait tant de fois auparavant, mais présente juste assez de différences pour nous obliger à recommencer le processus de cartographie des données, en grande partie à partir de zéro.

De plus, à mesure que les formats et les technologies les plus populaires pour y accéder continuent d'évoluer et que de nouveaux sont introduits et gagnent en popularité, les programmeurs sont obligés d'apprendre constamment de nouvelles techniques de conversion et de mappage de données, des bibliothèques, des API et des cadres. À mesure que les services de science des données continuent de se développer et d'évoluer, la demande d'outils spécialisés augmente également.

Bien que vous puissiez tirer parti d'outils comme AutoMapper (pour mapper des données d'un objet à un autre) ou Resharper (pour refactoriser du code existant), quoi que vous fassiez, le code sera fastidieux à écrire et devra toujours être maintenu. Et puis vous devez trouver une solution pour la gestion de la traduction inter-domaines - comme la conversion des codes internes et des valeurs clés en valeurs pour une autre couche ou système, des valeurs nulles en valeurs par défaut, la conversion de type, etc.

La validation a des problèmes similaires qui sont résolus par des technologies telles que DataAnnotations et le plugin jQuery Validation et par des tonnes de code de validation personnalisé. Et les nuances avec chacune de ces technologies peuvent être assez subtiles.

En tant que data scientist avancé, vous vous dites « Il doit y avoir une meilleure solution ». Eh bien, en fait, il y en a. Et c'est de cela qu'il s'agit dans ce tutoriel de mappage de données.

Présentation de l'outil de cartographie des données MetaDapper

MetaDapper est un outil de mappage de données permettant d'affiner ce processus à l'aide de diverses techniques de mappage de données.

MetaDapper est une bibliothèque .NET qui s'efforce de simplifier et de rationaliser au maximum le processus de conversion des données.

MetaDapper facilite la conversion des données en :

  • Découplage des parties passe-partout reproductibles du processus de conversion des données des aspects propres à chaque tâche de transformation des données.
  • Fournit une interface utilisateur intuitive et facile à utiliser pour spécifier des règles de mappage et de traduction de complexité arbitraire.

MetaDapper sépare le mappage logique (schéma, traduction des données et validation) du mappage physique des données (conversion vers et depuis divers formats de fichiers et API). Le mappage logique comporte un ensemble puissant de fonctions et vous permet d'accrocher vos propres méthodes pour gérer des besoins très spécifiques. Le mappage physique comprend un riche ensemble de formats pris en charge qui sont constamment étendus. Pour configurer un mappage, le configurateur MetaDapper est fourni ; un exécutable Windows simple à utiliser pour créer et modifier des mappages, et pour les exécuter à des fins de test ou pour des conversions ponctuelles.

La conversion d'une liste d'instances de classe en fichiers XML ou CSV, le remplissage d'enregistrements de base de données SQL, la génération de scripts SQL pour le remplissage de tables, la création de feuilles de calcul, et bien plus encore, sont tous effectués à l'aide du même fichier de configuration qui peut souvent être créé en quelques secondes.

Pour inclure MetaDapper dans votre programme .NET, il vous suffit de :

  • Ajouter une référence à la bibliothèque
  • Instancier le moteur MetaDapper
  • Exécutez le mappage, en spécifiant le lecteur source (et tous les paramètres), l'enregistreur de destination (et tous les paramètres) et votre fichier de configuration.

En cas de succès, l'écrivain produira les données transformées. En cas d'erreur, une exception renverra des informations d'erreur détaillées afin que vous puissiez rejeter les données ou ajuster la configuration.

Voici un bref exemple de mappage de données :

 List<MyClass> result; try { // Instantiate the MetaDapper library. var log = new Log(); var cultureInfo = new CultureInfo("en-US"); var md = new MetaDapper.Engine.MetaDapper(log, cultureInfo); using (var inputStream = new StreamReader(@"C:\myfile.csv")) { md.MapData( new CsvReaderParameters { Log = log, CultureInfo = cultureInfo, InputStream = inputStream.BaseStream, InputEncoding = Encoding.ASCII, FirstRecordIsHeader = false }, new PublicPropertiesWriterParameters { Log = log, CultureInfo = cultureInfo }, @"C:\MyMetaDapperConfiguration.xml", false, out result); } } catch (Exception) { throw; }

Le "configurateur" MetaDapper

Le configurateur MetaDapper fournit un moyen de parcourir visuellement les étapes de définition de votre structure de données et des règles de conversion/mappage. Le configurateur vous permet de créer, de modifier et d'exécuter des configurations (c'est-à-dire pour des tests ou des conversions ponctuelles).

Le configurateur de MetaDapper s'efforce d'automatiser autant que possible le processus. Par exemple, lors de la spécification d'un mappage de champ, les champs source et de destination sont mis en correspondance automatiquement lorsque cela est possible à l'aide de la correspondance de nom. De même, lors de la création de définitions d'enregistrement pour des sources de données contenant des métadonnées, les définitions de champ peuvent être renseignées automatiquement en pointant sur la source de données.

Une fois créée, une définition d'enregistrement conserve son lien avec la source de données à partir de laquelle elle a été créée (le cas échéant) afin qu'elle puisse être automatiquement mise à jour si le schéma de la source de données change par la suite. Lors de la configuration d'une définition d'enregistrement pour une source de données avec peu ou pas de métadonnées disponibles, si une autre source de données similaire contenant des métadonnées est disponible, cette définition d'enregistrement peut être copiée (avec ses métadonnées) pour servir de base à la nouvelle définition d'enregistrement et peuvent ensuite être modifiés pour refléter toute différence pouvant exister entre les deux sources de données. Et dans les cas où le schéma et les métadonnées sont identiques pour plusieurs sources de données, une seule définition d'enregistrement peut être utilisée pour toutes.

Simplification du processus de conversion des données

Examinons plus en détail certains des défis inhérents au processus de conversion de données et la manière dont MetaDapper les facilite et les simplifie pour le développeur.

Mappage des données source aux données de destination

Lorsqu'une structure interne ou externe est modifiée au cours de la maintenance, tout code de mappage qui repose sur ces structures peut également devoir être ajusté. Il s'agit d'un domaine où des travaux de maintenance sont souvent nécessaires, donc quelle que soit la solution que vous utilisez, les coûts de maintenance doivent être évalués. Par exemple, si une propriété TotalSale est supprimée d'une classe Sale, toutes les affectations de mappage associées doivent être ajustées en conséquence.

Avec MetaDapper, la mise à jour d'un mappage peut prendre aussi peu que quelques secondes. Pour un type de classe, par exemple, cliquez simplement sur le bouton "Importer les définitions de champs de la classe" pour actualiser les champs avec la définition nouvellement compilée :

Mappage des données source aux données de destination

Conversion de types

Certaines conversions de type, telles que les conversions de type Date/Heure et Nombre par exemple, sont sensibles aux paramètres internationaux de l'environnement hôte (sauf indication explicite dans le code). Déployer une application sur un nouveau serveur avec des paramètres internationaux différents peut donc casser du code qui n'en tient pas compte. Une valeur de date de "1-2-2014", par exemple, sera interprétée comme le 2 janvier 2014 sur une machine avec les paramètres américains, mais comme le 1er février 2014 sur une machine avec les paramètres britanniques. MetaDapper prend en charge toutes les conversions .NET implicites et permet également un reformatage complexe des valeurs dans le cadre de la traduction. De plus, des paramètres internationaux séparés (c'est-à-dire indépendants) peuvent être spécifiés dans les lecteurs, les rédacteurs et le moteur de mappage MetaDapper.

Valeurs par défaut complexes

Parfois, des règles métier spécifiques nécessitant l'accès à d'autres systèmes ou nécessitant un codage complexe pour déterminer une valeur par défaut sont nécessaires. MetaDapper permet d'enregistrer n'importe quel nombre de méthodes déléguées personnalisées auprès du moteur et de les utiliser pour fournir des valeurs par défaut, effectuer une conversion de données personnalisée et fournir une validation de champ personnalisée.

Règles de validation conditionnelle

Il n'est pas rare que des valeurs de champ soient requises de manière conditionnelle (ou même que leurs valeurs valides dépendent des valeurs d'autres champs). Par exemple, il se peut que les champs Nom du partenaire et Code de sécurité sociale du partenaire restent vides, mais si un nom de partenaire est fourni, le code de sécurité sociale du partenaire (et éventuellement d'autres champs) doit être fourni. Ce type de validation conditionnelle est complexe et il est facile de se tromper dans le code personnalisé. En revanche, MetaDapper permet de configurer facilement ce type de relation de mappage de données. Plus précisément, une liste de champs dans une définition d'enregistrement peut être répertoriée dans un groupe de champs conditionnels obligatoires :

La relation entre ces exemples de champs de données est facile à configurer avec un outil de mappage de données comme MetaDapper.

Ensuite, dans un mappage, le groupe peut être associé à n'importe quel champ qui, s'il n'est pas nul, nécessiterait à son tour que tous les champs du groupe soient fournis. Par exemple:

Cet exemple de mappage de données montre une configuration plus facile à l'aide de MetaDapper par rapport au code personnalisé.

Conversion des valeurs mappées entre les domaines

Les données source peuvent contenir des valeurs incohérentes. Par exemple, un champ de salutation peut contenir "M.", "Mr", "MR.", "Monsieur" ou "M" ainsi que tous les équivalents féminins. Ou un champ de devise peut contenir une valeur comme "$" alors que votre format de destination nécessite "USD". Les codes de produit sont un autre exemple de valeurs qui peuvent devoir être converties d'un système à un autre. MetaDapper permet de spécifier des « listes de synonymes » réutilisables qui peuvent être utilisées pour traduire les valeurs lors des mappages.

Une fois défini, vous pouvez spécifier le groupe de synonymes pour l'utiliser dans n'importe quel mappage de champ pertinent :

Cette technique de mappage de données gère bien les synonymes dans l'exemple de la sécurité sociale.

Mappages basés sur le formatage des valeurs et les calculs complexes

Les valeurs d'un ou plusieurs champs peuvent devoir être utilisées pour formater une nouvelle valeur. Par exemple, la valeur source peut avoir besoin d'être décorée avec des constantes (par exemple, sale.PriceEach = "$" + priceEach; ) ou plusieurs champs peuvent devoir être utilisés pour générer une valeur (par exemple, sale.Code = code1 + “_” + code2; ).

MetaDapper fournit une fonctionnalité de mise en forme/modèle qui vous permet de créer des valeurs à l'aide de l'un des champs de l'enregistrement en cours, y compris des parties de sous-chaîne de champs ou des valeurs constantes. Après le formatage, la valeur sera convertie dans le type de destination spécifié (qui, incidemment, n'a pas besoin d'être une chaîne).

De même, des calculs complexes peuvent être effectués pendant les mappages, en utilisant un ensemble complet d'opérateurs et de fonctions mathématiques sur n'importe quelle combinaison de valeurs de champ et de constantes.

Règles de validation

Les délégués de validation personnalisés peuvent être enregistrés et utilisés dans les mappages. Voici un exemple de méthode personnalisée pour valider qu'une valeur de champ est un entier (sans faire du type de données du champ un entier) :

 private static bool ValidateIsInteger( Log log, CultureInfo cultureInfo, object value, ref List<ErrorInfo> errors) { try { Convert.ToInt32(value); } catch (Exception) { return false; } return true; }

La méthode serait enregistrée lors de l'instanciation de MetaDapper. Ensuite, il pourrait être facilement appliqué dans n'importe quelle définition de mappage de champ :

Illustration de la définition MetaDapper

Regroupement, tri et filtrage

Les opérations de regroupement et de tri peuvent souvent être gérées dans une requête de base de données, mais toutes les sources de données ne sont pas des bases de données. MetaDapper prend donc en charge la configuration d'opérations complexes de regroupement et de tri pouvant être effectuées en mémoire.

Dans les cas où seule une partie des données source peut être nécessaire, le filtrage à partir de sources autres que la base de données peut être très complexe à mettre en œuvre et à gérer. MetaDapper prend en charge la configuration de filtres complexes avec des opérateurs booléens pour n'importe quel nombre d'évaluations de champs par enregistrement, avec une imbrication arbitrairement profonde des opérations selon les besoins. Par exemple:

Les filtres complexes jouent un rôle important dans le processus de mappage des données présenté ici.

Le filtre ci-dessus est équivalent au code C# suivant :

 if (sale.TransactionID > “0” AND sale.Currency == “USD” AND (sale.Amount > “3” || sale.Amount == “1”)

Mappages imbriqués

Certains mappages nécessitent plusieurs passages pour terminer le processus de conversion des données. Certains exemples incluent des données qui nécessitent des enregistrements de préfixe ou de sommation, des données qui doivent être mappées différemment en fonction des valeurs de champ ou de la structure du document, ou simplement pour isoler différentes étapes d'un mappage complexe (c'est-à-dire traduire des noms, convertir des types, etc.). À cette fin, MetaDapper prend en charge les mappages imbriqués à n'importe quel niveau de profondeur.

Format vs structure

En tant qu'outil de mappage et de conversion de données, MetaDapper est conçu pour permettre la lecture ou l'écriture de pratiquement n'importe quel format de données à l'aide d'interfaces internes de lecture et d'écriture. Cela permet la création de classes de lecture/écriture extrêmement légères et axées uniquement sur les nuances spécifiques au format.

Les lecteurs et les écrivains se comportent également de manière aussi intelligente et flexible que possible. Par exemple, le lecteur et l'écrivain XML utilisent XPaths pour spécifier où récupérer ou écrire des données dans un fichier XML. La même configuration peut également être utilisée pour lire et écrire, par exemple, à partir de formats non XML (tels que des fichiers CSV), auquel cas les valeurs XPath seront simplement ignorées. De même, si une configuration qui n'inclut pas les paramètres XPath est utilisée avec un lecteur ou un écrivain XML, une erreur sera générée.

Ouais. Droit. Sûr. (Quelques exemples de mappage de données réelles)

Vous êtes sceptique. Et je ne te blâme pas. Les outils logiciels sont rarement tout ce qu'ils prétendent être. Voici donc quelques exemples concrets où MetaDapper a déjà été utilisé pour fournir des avantages opérationnels.

Une entreprise qui fournit un logiciel de gestion d'assurance médicale avait des clients qui ne souhaitaient pas remplir de formulaires Web, mais souhaitaient fournir leurs données dans des feuilles de calcul. À l'aide de MetaDapper, les feuilles de calcul téléchargées sont lues en mémoire, les données nettoyées, les enregistrements validés et les résultats stockés dans leur base de données. Ils sont en mesure d'accepter les fichiers Excel de leurs clients sans aucune validation humaine à l'aide de MetaDapper avec un fichier de configuration facile à créer pour chaque modèle de feuille de calcul qu'ils publient.

Une grande entreprise gazière dispose d'une application interne et souhaite que ses utilisateurs de gestion puissent télécharger des rapports au format Excel. Les formats de rapport seraient probablement modifiés régulièrement. MetaDapper a facilité la génération de feuilles Excel à partir de leur base de données. La mise à jour des formats Excel ne nécessitait que la mise à jour des fichiers de configuration MetaDapper sans aucun changement de code ni recompilation.

Une société qui fournit un logiciel de gestion d'actifs avait besoin d'une solution pour générer des données financières dans des formats de progiciels comptables dépendant du client pour les importer dans ces systèmes. Une requête générique de données comptables a été développée à l'aide d'un wrapper ORM et MetaDapper a été utilisé pour trier, filtrer et mapper les données dans le schéma et le format souhaités pour chaque client. Une ou plusieurs configurations MetaDapper sont créées pour chaque client, ce qui est devenu une caractéristique de vente majeure pour les nouveaux clients. Le produit peut être configuré (à l'aide de MetaDapper) en quelques minutes pour prendre en charge n'importe quel format de progiciel de comptabilité personnalisé ou standard, de sorte que l'intégration avec les systèmes essentiels et existants est incluse avec chaque nouvelle vente. La même société utilise MetaDapper dans divers projets d'intégration de logiciels, mappant et convertissant des données et convertissant des codes internes entre leurs systèmes.

Un important revendeur automobile avait besoin d'ajouter des rapports de ventes au format Excel à l'une de ses applications. Les rapports ont été ajoutés à l'application en moins d'une heure, du début à la fin.

Un développeur avait besoin d'un tableau des États américains identique à celui utilisé sur un autre site Web. MetaDapper a été utilisé pour extraire les données du site et générer un script SQL pour remplir sa table en quelques minutes.

Ce ne sont là que quelques exemples de l'utilité et de la valeur éprouvées de MetaDapper en tant qu'outil de mappage de données.

Emballer

Il faut un saut mental pour commencer à penser à la conversion de données de manière plus générique et pour commencer à penser à des ensembles de données avec des règles métier et une utilité illimitée. MetaDapper est un cadre qui favorise et facilite cette perspective.

Que vous utilisiez MetaDapper, une autre technologie, ou que vous déployiez vos propres solutions de mappage de données, cela a été une introduction à la complexité et aux coûts cachés des projets de conversion de données. J'espère que vous la trouverez instructive.

(Pour plus d'informations sur MetaDapper, contactez l'équipe MetaDapper à [email protected].)