MetaDapper: Datenzuordnung und -konvertierung leicht gemacht mit den richtigen Tools

Veröffentlicht: 2022-03-11

Datenkonvertierung, -übersetzung und -kartierung ist keine Raketenwissenschaft, aber auf jeden Fall mühsam. Selbst eine einfache Datenkonvertierungsaufgabe (z. B. das Einlesen einer CSV-Datei in eine Liste von Klasseninstanzen) kann eine nicht triviale Menge an Code erfordern. Während alle diese Aufgaben viel gemeinsam haben, sind sie alle „gerade so unterschiedlich“, dass sie ihre eigenen Datenkonvertierungsmethoden erfordern.

In praktisch jedem System, das wir bauen, müssen wir irgendwann Daten von einer Form in eine andere umwandeln, sei es zum Importieren von Daten aus einem vorhandenen Datenspeicher, zum Verarbeiten von Daten aus einem eingehenden Stream oder zum Übersetzen von einem Format in ein anderes für interne Zwecke Verarbeitung oder Umwandlung von Daten in ein gewünschtes Ausgabeformat.

Und jedes Mal, wenn wir dies tun, scheint die Aufgabe dem, was wir so oft zuvor getan haben, so frustrierend ähnlich zu sein, hat aber gerade genug Unterschiede, um von uns zu verlangen, den Datenzuordnungsprozess noch einmal zu machen, größtenteils von Grund auf neu.

Da sich die beliebtesten Formate und Technologien für den Zugriff darauf weiterentwickeln und neue eingeführt werden und an Popularität gewinnen, müssen Programmierer außerdem ständig neue Datenkonvertierungs- und Mapping-Techniken, Bibliotheken, APIs und Frameworks lernen. Da sich Data-Science-Dienste weiterentwickeln und weiterentwickeln, wächst auch die Nachfrage nach spezialisierten Tools.

Obwohl Sie Tools wie AutoMapper (um Daten von einem Objekt auf ein anderes abzubilden) oder Resharper (um bestehenden Code umzugestalten) nutzen können, ist der Code unabhängig davon, was Sie tun, mühsam zu schreiben und muss immer gepflegt werden. Und dann müssen Sie eine Lösung für die domänenübergreifende Übersetzungsbehandlung finden – wie das Konvertieren interner Codes und Schlüsselwerte in Werte für eine andere Schicht oder ein anderes System, Nullwerte in Standardwerte, Typkonvertierung usw.

Bei der Validierung gibt es ähnliche Probleme, die von Technologien wie DataAnnotations und dem jQuery-Validierungs-Plug-In sowie von unzähligen benutzerdefinierten Validierungscodes angegangen werden. Und die Nuancen bei jeder dieser Technologien können sehr subtil sein.

Als fortgeschrittener Datenwissenschaftler sagen Sie sich: „Das muss doch besser gehen.“ Nun, tatsächlich gibt es das. Und darum geht es in diesem Data-Mapping-Tutorial.

Einführung des MetaDapper-Datenzuordnungstools

MetaDapper ist ein Datenzuordnungstool, das dabei hilft, diesen Prozess mithilfe verschiedener Datenzuordnungstechniken zu verfeinern.

MetaDapper ist eine .NET-Bibliothek, die bestrebt ist, den Datenkonvertierungsprozess so weit wie möglich zu vereinfachen und zu rationalisieren.

MetaDapper erleichtert die Datenkonvertierung durch:

  • Entkopplung der wiederholbaren Boilerplate-Teile des Datenkonvertierungsprozesses von den Aspekten, die für jede Datentransformationsaufgabe einzigartig sind.
  • Bereitstellung einer benutzerfreundlichen, intuitiven Benutzeroberfläche zum Festlegen von Abbildungs- und Übersetzungsregeln beliebiger Komplexität.

MetaDapper trennt die logische Zuordnung (Schema, Datenübersetzung und Validierung) von der physischen Datenzuordnung (Konvertierung in und aus verschiedenen Dateiformaten und APIs). Das logische Mapping verfügt über einen leistungsstarken Satz von Funktionen und ermöglicht es Ihnen, Ihre eigenen Methoden einzubinden, um sehr spezifische Anforderungen zu erfüllen. Das physische Mapping umfasst eine Vielzahl unterstützter Formate, die ständig erweitert werden. Um eine Zuordnung zu konfigurieren, wird der MetaDapper-Konfigurator bereitgestellt; eine einfach zu verwendende ausführbare Windows-Datei zum Erstellen und Bearbeiten von Mappings und zum Ausführen zum Testen oder für einmalige Konvertierungen.

Das Konvertieren einer Liste von Klasseninstanzen in XML- oder CSV-Dateien, das Füllen von SQL-Datenbankdatensätzen, das Generieren von SQL-Skripten zum Füllen von Tabellen, das Erstellen von Tabellenkalkulationen und vieles mehr erfolgt mit derselben Konfigurationsdatei, die oft in Sekundenschnelle erstellt werden kann.

Um MetaDapper in Ihr .NET-Programm einzubinden, müssen Sie einfach:

  • Fügen Sie einen Verweis auf die Bibliothek hinzu
  • Instanziieren Sie die MetaDapper-Engine
  • Führen Sie das Mapping aus und geben Sie den Quell-Reader (und alle Parameter), den Ziel-Writer (und alle Parameter) und Ihre Konfigurationsdatei an.

Bei Erfolg gibt der Writer die transformierten Daten aus. Bei einem Fehler gibt eine Ausnahme detaillierte Fehlerinformationen zurück, sodass Sie die Daten ablehnen oder die Konfiguration optimieren können.

Hier ist ein kurzes Beispiel für die Datenzuordnung:

 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; }

Der MetaDapper „Konfigurator“

Der MetaDapper-Konfigurator bietet eine Möglichkeit, visuell durch die Schritte zum Definieren Ihrer Datenstruktur und Konvertierungs-/Mapping-Regeln zu gehen. Der Konfigurator ermöglicht das Erstellen, Bearbeiten und Ausführen von Konfigurationen (z. B. für Tests oder einmalige Umbauten).

Der Konfigurator von MetaDapper ist bestrebt, den Prozess so weit wie möglich zu automatisieren. Wenn Sie beispielsweise eine Feldzuordnung angeben, werden die Quell- und Zielfelder nach Möglichkeit automatisch mithilfe des Namensabgleichs abgeglichen. Auch beim Erstellen von Datensatzdefinitionen für Datenquellen, die Metadaten enthalten, können die Felddefinitionen automatisch ausgefüllt werden, indem auf die Datenquelle gezeigt wird.

Nach der Erstellung behält eine Datensatzdefinition ihre Verknüpfung mit der Datenquelle bei, aus der sie erstellt wurde (falls vorhanden), sodass sie automatisch aktualisiert werden kann, wenn sich das Datenquellenschema später ändert. Wenn beim Konfigurieren einer Datensatzdefinition für eine Datenquelle mit wenigen oder keinen verfügbaren Metadaten eine andere ähnliche Datenquelle verfügbar ist, die Metadaten enthält, kann diese Datensatzdefinition (mit ihren Metadaten) kopiert werden, um als Grundlage für die neue Datensatzdefinition zu dienen können dann bearbeitet werden, um eventuelle Unterschiede zwischen den beiden Datenquellen widerzuspiegeln. Und in Fällen, in denen das Schema und die Metadaten für mehrere Datenquellen identisch sind, kann eine einzelne Datensatzdefinition für alle verwendet werden.

Vereinfachung des Datenkonvertierungsprozesses

Sehen wir uns einige der Herausforderungen, die dem Datenkonvertierungsprozess innewohnen, und die Art und Weise, wie MetaDapper sie für den Entwickler erleichtert und vereinfacht, genauer an.

Zuordnen von Quell- zu Zieldaten

Wenn eine interne oder externe Struktur im Zuge der Wartung geändert wird, muss möglicherweise auch jeder Mapping-Code angepasst werden, der auf diesen Strukturen basiert. Dies ist ein Bereich, in dem häufig Wartungsarbeiten erforderlich sind. Unabhängig davon, welche Lösung Sie verwenden, müssen die Wartungskosten bewertet werden. Wenn beispielsweise eine TotalSale-Eigenschaft aus einer Sale-Klasse entfernt wird, müssen alle zugehörigen Zuordnungszuweisungen entsprechend angepasst werden.

Mit MetaDapper kann die Aktualisierung einer Zuordnung nur wenige Sekunden dauern. Klicken Sie beispielsweise für einen Klassentyp einfach auf die Schaltfläche „Felddefinitionen aus Klasse importieren“, um die Felder auf die neu kompilierte Definition zu aktualisieren:

Zuordnen von Quell- zu Zieldaten

Typumwandlung

Einige Typkonvertierungen, wie z. B. Datum/Uhrzeit- und Zahlentypkonvertierungen, reagieren empfindlich auf die internationalen Einstellungen der Hostumgebung (sofern nicht ausdrücklich im Code angegeben). Die Bereitstellung einer Anwendung auf einem neuen Server mit anderen internationalen Einstellungen kann daher Code beschädigen, der dies nicht berücksichtigt. Ein Datumswert von „1-2-2014“ wird beispielsweise auf einem Computer mit US-Einstellungen als 2. Januar 2014 interpretiert, auf einem Computer mit UK-Einstellungen jedoch als 1. Februar 2014. MetaDapper unterstützt alle impliziten .NET-Konvertierungen und ermöglicht auch eine komplexe Neuformatierung von Werten als Teil der Übersetzung. Darüber hinaus können separate (dh unabhängige) internationale Einstellungen in MetaDapper-Readern, -Writern und der Mapping-Engine angegeben werden.

Komplexe Standardwerte

Manchmal sind bestimmte Geschäftsregeln erforderlich, die den Zugriff auf andere Systeme erfordern oder eine komplexe Codierung erfordern, um einen Standardwert zu bestimmen. MetaDapper ermöglicht die Registrierung einer beliebigen Anzahl von benutzerdefinierten Delegate-Methoden bei der Engine und die Verwendung zum Bereitstellen von Standardwerten, zum Durchführen einer benutzerdefinierten Datenkonvertierung und zum Bereitstellen einer benutzerdefinierten Feldvalidierung.

Bedingte Validierungsregeln

Es ist nicht ungewöhnlich, dass Feldwerte bedingt erforderlich sind (oder dass ihre gültigen Werte sogar von den Werten anderer Felder abhängen). Beispielsweise kann es vorkommen, dass die Felder Name des Partners und Sozialversicherungscode des Partners leer gelassen werden können, aber wenn ein Name des Partners angegeben wird, dann muss der Sozialversicherungscode des Partners (und möglicherweise andere Felder) angegeben werden. Diese Art der bedingten Validierung ist komplex und kann in benutzerdefiniertem Code leicht falsch gemacht werden. Im Gegensatz dazu ermöglicht MetaDapper die einfache Konfiguration dieser Art von Datenzuordnungsbeziehung. Insbesondere kann eine Liste von Feldern in einer Datensatzdefinition in einer Gruppe bedingter Pflichtfelder aufgelistet werden:

Die Beziehung zwischen diesen Beispieldatenfeldern lässt sich mit einem Datenzuordnungstool wie MetaDapper einfach konfigurieren.

Dann kann die Gruppe in einer Zuordnung mit jedem Feld verknüpft werden, das, wenn es nicht null ist, wiederum erfordern würde, dass alle Felder in der Gruppe bereitgestellt werden. Zum Beispiel:

Dieses Datenzuordnungsbeispiel zeigt eine einfachere Konfiguration mit MetaDapper im Vergleich zu benutzerdefiniertem Code.

Konvertieren zugeordneter Werte über Domänen hinweg

Quelldaten können inkonsistente Werte enthalten. Beispielsweise kann ein Anredefeld „Herr“, „Herr“, „Herr“, „Herr“ oder „M“ sowie alle weiblichen Äquivalente enthalten. Oder ein Währungsfeld kann einen Wert wie „$“ enthalten, während Ihr Zielformat „USD“ erfordert. Produktcodes sind ein weiteres Beispiel für Werte, die möglicherweise von einem System in ein anderes konvertiert werden müssen. MetaDapper ermöglicht die Spezifikation wiederverwendbarer „Synonymlisten“, die verwendet werden können, um Werte während Mappings zu übersetzen.

Nach der Definition können Sie die Synonymgruppe angeben, um sie in jeder relevanten Feldzuordnung zu verwenden:

Diese Datenzuordnungstechnik handhabt Synonyme im Beispiel der Sozialversicherung gut.

Zuordnungen basierend auf Wertformatierung und komplexen Berechnungen

Werte aus einem oder mehreren Feldern müssen möglicherweise verwendet werden, um einen neuen Wert zu formatieren. Beispielsweise muss der Quellwert möglicherweise mit Konstanten dekoriert werden (z. B. sale.PriceEach = "$" + priceEach; ) oder es müssen mehrere Felder verwendet werden, um einen Wert zu generieren (z. B. sale.Code = code1 + “_” + code2; ).

MetaDapper bietet eine Formatierungs-/Vorlagenfunktion, mit der Sie Werte unter Verwendung beliebiger Felder im aktuellen Datensatz erstellen können, einschließlich Teilzeichenfolgen von Feldern oder konstanten Werten. Nach der Formatierung wird der Wert in den angegebenen Zieltyp konvertiert (der übrigens kein String sein muss).

In ähnlicher Weise können komplexe Berechnungen während Mappings durchgeführt werden, wobei ein vollständiger Satz mathematischer Operatoren und Funktionen für eine beliebige Kombination von Feldwerten und Konstanten verwendet wird.

Validierungsregeln

Benutzerdefinierte Validierungsdelegates können registriert und in Mappings verwendet werden. Hier ist ein Beispiel für eine benutzerdefinierte Methode, um zu überprüfen, ob ein Feldwert eine Ganzzahl ist (ohne den Datentyp für das Feld zu einer Ganzzahl zu machen):

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

Die Methode würde beim Instanziieren von MetaDapper registriert. Dann könnte es einfach in jeder Feldzuordnungsdefinition angewendet werden:

Abbildung der MetaDapper-Definition

Gruppieren, Sortieren und Filtern

Gruppierungs- und Sortieroperationen können oft in einer Datenbankabfrage behandelt werden, aber nicht alle Datenquellen sind Datenbanken. MetaDapper unterstützt daher die Konfiguration komplexer Gruppierungs- und Sortiervorgänge, die im Speicher durchgeführt werden können.

In Fällen, in denen möglicherweise nur ein Teil der Quelldaten benötigt wird, kann das Filtern aus Nicht-Datenbankquellen sehr komplex zu implementieren und zu warten sein. MetaDapper unterstützt die Konfiguration komplexer Filter mit booleschen Operatoren für eine beliebige Anzahl von Feldauswertungen pro Datensatz, mit beliebig tiefer Verschachtelung von Operationen nach Bedarf. Zum Beispiel:

Komplexe Filter spielen eine wichtige Rolle in dem hier gezeigten Datenmapping-Prozess.

Der obige Filter entspricht dem folgenden C#-Code:

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

Verschachtelte Zuordnungen

Einige Mappings erfordern mehrere Durchgänge, um den Datenkonvertierungsprozess abzuschließen. Einige Beispiele umfassen Daten, die Präfix- oder Summationsdatensätze erfordern, Daten, die je nach Feldwerten oder Dokumentstruktur unterschiedlich zugeordnet werden müssen, oder einfach um verschiedene Phasen einer komplexen Zuordnung zu isolieren (z. B. Namen übersetzen, Typkonvertierungen usw.). Zu diesem Zweck unterstützt MetaDapper verschachtelte Mappings bis zu jeder Tiefe.

Format vs. Struktur

Als Datenzuordnungs- und Konvertierungstool ist MetaDapper so konstruiert, dass praktisch jedes Datenformat gelesen oder geschrieben werden kann, indem interne Lese- und Schreibschnittstellen verwendet werden. Dies ermöglicht die Erstellung von Reader/Writer-Klassen, die extrem leichtgewichtig sind und sich nur auf die formatspezifischen Nuancen konzentrieren.

Auch Leser und Schreiber verhalten sich möglichst intelligent und flexibel. XML-Reader und -Writer verwenden beispielsweise XPaths, um anzugeben, wo Daten in einer XML-Datei abgerufen oder geschrieben werden sollen. Dieselbe Konfiguration kann auch zum Lesen und Schreiben von beispielsweise Nicht-XML-Formaten (wie CSV-Dateien) verwendet werden, wobei die XPath-Werte in diesem Fall einfach ignoriert werden. Ebenso wird ein Fehler generiert, wenn eine Konfiguration, die keine XPath-Einstellungen enthält, mit einem XML-Reader oder -Writer verwendet wird.

Ja. Rechts. Sicher. (Einige Beispiele für echte Datenzuordnungen)

Sie sind skeptisch. Und ich mache dir keine Vorwürfe. Software-Tools sind selten alles, was sie vorgeben zu sein. Hier sind also einige Beispiele aus der Praxis, bei denen MetaDapper bereits eingesetzt wurde, um betriebliche Vorteile zu bieten.

Ein Unternehmen, das Verwaltungssoftware für Krankenversicherungen anbietet, hatte Kunden, die keine Webformulare ausfüllen wollten, sondern ihre Daten in Tabellenkalkulationen bereitstellen wollten. Mit MetaDapper werden hochgeladene Tabellenkalkulationen in den Speicher eingelesen, Daten bereinigt, Aufzeichnungen validiert und die Ergebnisse in ihrer Datenbank gespeichert. Sie können Excel-Dateien von ihren Kunden ohne menschliche Validierung akzeptieren, indem sie MetaDapper mit einer einfach zu erstellenden Konfigurationsdatei für jede von ihnen veröffentlichte Tabellenkalkulationsvorlage verwenden.

Ein großes Gasunternehmen hat eine interne Anwendung und wollte, dass seine Verwaltungsbenutzer Berichte im Excel-Format herunterladen können. Die Berichtsformate würden wahrscheinlich regelmäßig geändert. MetaDapper erleichterte die Generierung von Excel-Tabellen aus ihrer Datenbank. Die Aktualisierung der Excel-Formate erforderte nur die Aktualisierung der MetaDapper-Konfigurationsdateien ohne Codeänderung oder Neukompilierung.

Ein Unternehmen, das Vermögensverwaltungssoftware anbietet, benötigte eine Lösung zur Generierung von Finanzdaten in kundenabhängigen Buchhaltungspaketformaten für den Import in diese Systeme. Unter Verwendung eines ORM-Wrappers wurde eine generische Buchhaltungsdatenabfrage entwickelt, und MetaDapper wurde verwendet, um Daten in das gewünschte Schema und Format für jeden Kunden zu sortieren, zu filtern und zuzuordnen. Für jeden Kunden werden eine oder mehrere MetaDapper-Konfigurationen erstellt, und dies ist zu einem wichtigen Verkaufsmerkmal für Neukunden geworden. Das Produkt kann (mithilfe von MetaDapper) in wenigen Minuten konfiguriert werden, um jedes benutzerdefinierte oder standardmäßige Buchhaltungspaketformat zu unterstützen, sodass die Integration mit wesentlichen und bestehenden Systemen bei jedem neuen Verkauf inbegriffen ist. Dasselbe Unternehmen verwendet MetaDapper in verschiedenen Softwareintegrationsprojekten, um Daten abzubilden und zu konvertieren und interne Codes zwischen ihren Systemen zu konvertieren.

Ein großer Autohändler musste einige Verkaufsberichte im Excel-Format zu einer seiner Anwendungen hinzufügen. Die Berichte wurden der Anwendung in weniger als einer Stunde hinzugefügt – von Anfang bis Ende.

Ein Entwickler benötigte eine Tabelle der US-Bundesstaaten, die mit der auf einer anderen Website verwendeten Tabelle identisch ist. MetaDapper wurde verwendet, um die Daten der Website zu minen und ein SQL-Skript zu generieren, um seine Tabelle in wenigen Minuten zu füllen.

Dies sind nur einige Beispiele für die bewährte Nützlichkeit und den Wert von MetaDapper als Datenzuordnungstool.

Einpacken

Es bedarf eines mentalen Sprungs, um allgemeiner über Datenkonvertierung nachzudenken und über Datensätze mit Geschäftsregeln und unbegrenztem Nutzen nachzudenken. MetaDapper ist ein Framework, das diese Perspektive fördert und erleichtert.

Unabhängig davon, ob Sie MetaDapper, eine andere Technologie, verwenden oder Ihre eigenen Datenzuordnungslösungen entwickeln, dies war eine Einführung in einige der Komplexität und versteckten Kosten bei Datenkonvertierungsprojekten. Ich hoffe, Sie finden es informativ.

(Für weitere Informationen zu MetaDapper kontaktieren Sie das MetaDapper-Team unter [email protected].)