MetaDapper: łatwe mapowanie i konwersja danych dzięki odpowiednim narzędziom

Opublikowany: 2022-03-11

Konwersja, tłumaczenie i mapowanie danych nie jest w żadnym wypadku nauką o rakietach, ale jest zdecydowanie nużące. Nawet proste zadanie konwersji danych (np. wczytanie pliku CSV do listy instancji klas) może wymagać nietrywialnej ilości kodu. Chociaż wszystkie te zadania mają wiele wspólnego, wszystkie są „na tyle różne”, że wymagają własnych metod konwersji danych.

W praktycznie każdym systemie, który zbudujemy, w pewnym momencie będziemy musieli przekształcić dane z jednego formularza do drugiego, czy to w celu importowania danych z istniejącego magazynu danych, przetwarzania danych ze strumienia przychodzącego, tłumaczenia z jednego formatu na inny do celów wewnętrznych. przetwarzanie lub przekształcanie danych do pożądanego formatu wyjściowego.

I za każdym razem, gdy to robimy, zadanie wydaje się tak frustrująco podobne do tego, co robiliśmy tyle razy wcześniej, ale ma tylko tyle różnic, że wymaga od nas ponownego mapowania danych, głównie od zera.

Ponadto, ponieważ najpopularniejsze formaty i technologie dostępu do nich wciąż ewoluują, wprowadzane są nowe i zyskują popularność, programiści są zobowiązani do ciągłego poznawania nowych technik konwersji danych i mapowania, bibliotek, API i frameworków. Wraz z ciągłym rozwojem i ewolucją usług analizy danych rośnie również zapotrzebowanie na specjalistyczne narzędzia.

Chociaż możesz korzystać z narzędzi takich jak AutoMapper (do mapowania danych z jednego obiektu do drugiego) lub Resharper (do refaktoryzacji istniejącego kodu), niezależnie od tego, co robisz, pisanie kodu będzie żmudne i zawsze trzeba będzie go konserwować. A potem musisz wymyślić rozwiązanie do obsługi translacji międzydomenowej – jak konwersja kodów wewnętrznych i wartości kluczy na wartości dla innej warstwy lub systemu, wartości null na wartości domyślne, konwersja typów itp.

Walidacja ma podobne problemy, które są rozwiązywane przez technologie takie jak DataAnnotations i wtyczka jQuery Validation oraz przez ryzy niestandardowego kodu walidacji. A niuanse z każdą z tych technologii mogą być dość subtelne.

Jako zaawansowany analityk danych mówisz sobie: „Musi być lepszy sposób”. Cóż, w rzeczywistości jest. I o tym jest ten samouczek mapowania danych.

Przedstawiamy narzędzie do mapowania danych MetaDapper

MetaDapper to narzędzie do mapowania danych, które pomaga udoskonalić ten proces przy użyciu różnych technik mapowania danych.

MetaDapper to biblioteka .NET, która stara się maksymalnie uprościć i usprawnić proces konwersji danych.

MetaDapper ułatwia konwersję danych poprzez:

  • Oddzielenie powtarzalnych, standardowych części procesu konwersji danych od tych aspektów, które są unikalne dla każdego zadania transformacji danych.
  • Zapewnia łatwy w użyciu, intuicyjny interfejs użytkownika do określania reguł mapowania i tłumaczenia o dowolnej złożoności.

MetaDapper oddziela mapowanie logiczne (schemat, translację danych i walidację) od mapowania danych fizycznych (konwersję do iz różnych formatów plików i interfejsów API). Mapowanie logiczne zawiera potężny zestaw funkcji i pozwala na podpięcie własnych metod do obsługi bardzo specyficznych potrzeb. Mapowanie fizyczne obejmuje bogaty zestaw obsługiwanych formatów, które są stale rozszerzane. Aby skonfigurować mapowanie, dostępny jest konfigurator MetaDapper; prosty w użyciu plik wykonywalny systemu Windows do tworzenia i edytowania mapowań oraz wykonywania ich do testowania lub do jednorazowych konwersji.

Konwertowanie listy instancji klas do plików XML lub CSV, wypełnianie rekordów bazy danych SQL, generowanie skryptów SQL do wypełniania tabel, tworzenie arkuszy kalkulacyjnych i wiele więcej, odbywa się przy użyciu tego samego pliku konfiguracyjnego, który często można utworzyć w kilka sekund.

Aby włączyć MetaDapper do swojego programu .NET, wystarczy:

  • Dodaj odniesienie do biblioteki
  • Utwórz instancję silnika MetaDapper
  • Wykonaj mapowanie, określając czytnik źródłowy (i dowolne parametry), docelowy program zapisujący (i dowolne parametry) oraz plik konfiguracyjny.

Po pomyślnym zakończeniu zapisujący wyprowadzi przekształcone dane. W przypadku błędu wyjątek zwróci szczegółowe informacje o błędzie, dzięki czemu można odrzucić dane lub dostroić konfigurację.

Oto krótki przykład mapowania danych:

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

„Konfigurator” MetaDappera

Konfigurator MetaDapper umożliwia wizualne przejście przez etapy definiowania struktury danych i reguł konwersji/mapowania. Konfigurator umożliwia tworzenie, edycję i wykonywanie konfiguracji (tj. do testowania lub jednorazowych konwersji).

Konfigurator MetaDapper dąży do zautomatyzowania jak największej części procesu. Na przykład podczas określania mapowania pól pola źródłowe i docelowe są dopasowywane automatycznie, jeśli to możliwe, przy użyciu dopasowywania nazw. Ponadto podczas tworzenia definicji rekordów dla źródeł danych zawierających metadane definicje pól można wypełniać automatycznie, wskazując źródło danych.

Po utworzeniu definicja rekordu zachowuje łącze do źródła danych, z którego została utworzona (jeśli istnieje), dzięki czemu może być automatycznie aktualizowana w przypadku późniejszej zmiany schematu źródła danych. Podczas konfigurowania definicji rekordu dla źródła danych z niewielką ilością lub brakiem dostępnych metadanych, jeśli dostępne jest inne podobne źródło danych, które zawiera metadane, tę definicję rekordu można skopiować (wraz z jej metadanymi), aby służyć jako podstawa dla nowej definicji rekordu i można następnie edytować, aby odzwierciedlić wszelkie różnice, które mogą istnieć między dwoma źródłami danych. A w przypadkach, gdy schemat i metadane są identyczne dla wielu źródeł danych, można dla nich wszystkich użyć jednej definicji rekordu.

Uproszczenie procesu konwersji danych

Przyjrzyjmy się bardziej szczegółowo niektórym wyzwaniom związanym z procesem konwersji danych oraz sposobom, w jakie MetaDapper ułatwia i upraszcza je dla programisty.

Mapowanie danych źródłowych na docelowe

W przypadku zmiany wewnętrznej lub zewnętrznej struktury w trakcie konserwacji, każdy kod mapujący, który opiera się na tych strukturach, może również wymagać dostosowania. Jest to obszar, w którym często wymagane są prace konserwacyjne, więc niezależnie od zastosowanego rozwiązania należy oszacować koszty konserwacji. Na przykład, jeśli właściwość TotalSale zostanie usunięta z klasy Sale, wszelkie powiązane przypisania mapowania muszą zostać odpowiednio dostosowane.

Dzięki MetaDapperowi aktualizacja mapowania może zająć zaledwie kilka sekund. Na przykład w przypadku typu klasy wystarczy kliknąć przycisk „Importuj definicje pól z klasy”, aby odświeżyć pola do nowo skompilowanej definicji:

Mapowanie danych źródłowych na docelowe

Konwersja typu

Niektóre konwersje typu, takie jak konwersje typu Data/Godzina i Liczba, są wrażliwe na ustawienia międzynarodowe środowiska hosta (chyba że zostało to wyraźnie określone w kodzie). Wdrożenie aplikacji na nowym serwerze z innymi ustawieniami międzynarodowymi może zatem złamać kod, który nie bierze tego pod uwagę. Na przykład wartość daty „1-2-2014” zostanie zinterpretowana jako 2 stycznia 2014 r. w komputerze z ustawieniami w USA, ale jako 1 lutego 2014 r. w przypadku komputera z ustawieniami w Wielkiej Brytanii. MetaDapper obsługuje wszystkie niejawne konwersje .NET i umożliwia również złożone przeformatowanie wartości w ramach tłumaczenia. Co więcej, w czytnikach MetaDapper, programach do zapisu i silniku mapowania można określić oddzielne (tj. niezależne) ustawienia międzynarodowe.

Złożone wartości domyślne

Czasami potrzebne są określone reguły biznesowe, które wymagają dostępu do innych systemów lub wymagają złożonego kodowania, aby określić wartość domyślną. MetaDapper umożliwia zarejestrowanie dowolnej liczby niestandardowych metod delegatów w silniku i zastosowanie ich w celu dostarczenia wartości domyślnych, wykonania niestandardowej konwersji danych oraz zapewnienia walidacji pól niestandardowych.

Warunkowe zasady walidacji

Często zdarza się, że wartości pól są wymagane warunkowo (lub nawet ich prawidłowe wartości zależą od wartości innych pól). Na przykład może się zdarzyć, że pola Nazwa partnera i Kod ubezpieczenia społecznego partnera mogą pozostać puste, ale jeśli zostanie podana nazwa partnera, należy podać kod ubezpieczenia społecznego partnera (i ewentualnie inne pola). Ten rodzaj warunkowej walidacji jest złożony i łatwo można go pomylić w niestandardowym kodzie. Natomiast MetaDapper pozwala na łatwą konfigurację tego rodzaju relacji mapowania danych. W szczególności lista pól w definicji rekordu może być wymieniona w grupie warunkowych pól obowiązkowych:

Relację między tymi przykładowymi polami danych można łatwo skonfigurować za pomocą narzędzia do mapowania danych, takiego jak MetaDapper.

Następnie w mapowaniu grupa może być powiązana z dowolnym polem, które, jeśli nie ma wartości null, z kolei wymagałoby dostarczenia wszystkich pól w grupie. Na przykład:

Ten przykład mapowania danych pokazuje łatwiejszą konfigurację przy użyciu MetaDapper w porównaniu z kodem niestandardowym.

Konwertowanie zmapowanych wartości w różnych domenach

Dane źródłowe mogą zawierać niespójne wartości. Na przykład pole powitania może zawierać „Mr.”, „Mr”, „MR.”, „Mister” lub „M”, a także wszystkie żeńskie odpowiedniki. Lub pole waluty może zawierać wartość taką jak „$”, podczas gdy format docelowy wymaga „USD”. Kody produktów to kolejny przykład wartości, które mogą wymagać konwersji z jednego systemu na inny. MetaDapper pozwala na określenie „list synonimów” wielokrotnego użytku, które można wykorzystać do tłumaczenia wartości podczas mapowania.

Po zdefiniowaniu możesz określić grupę synonimów, aby zastosować ją w dowolnym odpowiednim mapowaniu pól:

Ta technika mapowania danych dobrze radzi sobie z synonimami w przykładzie Ubezpieczenia Społecznego.

Mapowania oparte na formatowaniu wartości i skomplikowanych obliczeniach

Do sformatowania nowej wartości może być konieczne użycie wartości z jednego lub większej liczby pól. Na przykład wartość źródłowa może wymagać dekorowania stałymi (np. sale.PriceEach = "$" + priceEach; ) lub kilka pól może być potrzebnych do wygenerowania wartości (np. sale.Code = code1 + “_” + code2; ).

MetaDapper udostępnia funkcję formatowania/szablonu, która umożliwia tworzenie wartości przy użyciu dowolnych pól w bieżącym rekordzie, w tym podciągów części pól lub wartości stałych. Po sformatowaniu wartość zostanie przekonwertowana na określony typ docelowy (który, nawiasem mówiąc, nie musi być ciągiem).

Podobnie złożone obliczenia można wykonać podczas mapowania, wykorzystując pełny zestaw operatorów i funkcji matematycznych na dowolnej kombinacji wartości pól i stałych.

Zasady walidacji

Niestandardowi delegaci walidacji mogą być rejestrowani i używani w mapowaniach. Oto przykład niestandardowej metody sprawdzania, czy wartość pola jest liczbą całkowitą (bez zmiany typu danych pola na liczbę całkowitą):

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

Metoda zostanie zarejestrowana podczas tworzenia instancji MetaDapper. Następnie można go łatwo zastosować w dowolnej definicji mapowania pól:

Ilustracja definicji MetaDapera

Grupowanie, sortowanie i filtrowanie

Operacje grupowania i sortowania często mogą być obsługiwane w zapytaniu do bazy danych, ale nie wszystkie źródła danych są bazami danych. Dlatego MetaDapper obsługuje konfigurację złożonych operacji grupowania i sortowania, które można wykonać w pamięci.

W przypadkach, w których może być potrzebna tylko część danych źródłowych, filtrowanie ze źródeł innych niż bazy danych może być bardzo skomplikowane w implementacji i utrzymaniu. MetaDapper obsługuje konfigurowanie złożonych filtrów za pomocą operatorów logicznych dla dowolnej liczby ocen pól na rekord, z dowolnie głębokim zagnieżdżaniem operacji w razie potrzeby. Na przykład:

Złożone filtry odgrywają ważną rolę w przedstawionym tutaj procesie mapowania danych.

Powyższy filtr jest odpowiednikiem następującego kodu C#:

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

Zagnieżdżone mapowania

Niektóre mapowania wymagają wielu przebiegów w celu zakończenia procesu konwersji danych. Niektóre przykłady obejmują dane, które wymagają rekordów przedrostków lub podsumowań, dane, które muszą być mapowane w różny sposób w zależności od wartości pól lub struktury dokumentu, lub po prostu w celu wyizolowania różnych etapów złożonego mapowania (tj. tłumaczenia nazw, konwersji typów itp.). W tym celu MetaDapper obsługuje zagnieżdżone mapowania na dowolnym poziomie głębokości.

Format a struktura

Jako narzędzie do mapowania i konwersji danych, MetaDapper jest skonstruowany tak, aby umożliwić odczytywanie lub zapisywanie praktycznie dowolnego formatu danych przy użyciu wewnętrznych interfejsów czytnika i zapisu. Pozwala to na tworzenie klas czytelnika/zapisu, które są niezwykle lekkie i skupiają się tylko na niuansach specyficznych dla formatu.

Czytelnicy i pisarze również zachowują się tak inteligentnie i elastycznie, jak to tylko możliwe. Na przykład czytnik i program piszący XML wykorzystują ścieżki XPath do określenia, gdzie pobierać lub zapisywać dane w pliku XML. Ta sama konfiguracja może być również używana do odczytu i zapisu, na przykład, z formatów innych niż XML (takich jak pliki CSV), w którym to przypadku wartości XPath zostaną po prostu zignorowane. Podobnie, jeśli konfiguracja, która nie zawiera ustawień XPath, jest używana z czytnikiem lub zapisem XML, zostanie wygenerowany błąd.

Tak. Prawidłowy. Pewny. (Kilka przykładów mapowania danych rzeczywistych)

Jesteś sceptyczny. I nie obwiniam cię. Narzędzia programowe rzadko są tym, za co się podają. Oto kilka przykładów z prawdziwego świata, w których MetaDapper został już wykorzystany do zapewnienia korzyści operacyjnych.

Firma dostarczająca oprogramowanie do zarządzania ubezpieczeniami medycznymi miała klientów, którzy nie chcieli wypełniać formularzy internetowych, ale chcieli udostępniać swoje dane w arkuszach kalkulacyjnych. Za pomocą MetaDapper załadowane arkusze kalkulacyjne są wczytywane do pamięci, dane są czyszczone, rekordy są weryfikowane, a wyniki przechowywane w ich bazie danych. Są w stanie akceptować pliki Excel od swoich klientów bez żadnej weryfikacji przez człowieka, używając MetaDapper z łatwym do utworzenia plikiem konfiguracyjnym dla każdego publikowanego szablonu arkusza kalkulacyjnego.

Duża firma gazownicza ma wewnętrzną aplikację i chciała, aby jej użytkownicy zarządzający mogli pobierać raporty w formacie Excel. Formaty raportów byłyby prawdopodobnie regularnie zmieniane. MetaDapper ułatwił generowanie arkuszy Excela z ich bazy danych. Aktualizacja formatów Excela wymagała jedynie aktualizacji plików konfiguracyjnych MetaDapper bez jakiejkolwiek zmiany kodu lub ponownej kompilacji.

Firma dostarczająca oprogramowanie do zarządzania aktywami potrzebowała rozwiązania do generowania danych finansowych w formatach pakietów księgowych zależnych od klienta do importu do tych systemów. Ogólne zapytanie o dane księgowe zostało opracowane przy użyciu opakowania ORM, a MetaDapper został użyty do sortowania, filtrowania i mapowania danych do pożądanego schematu i formatu dla każdego klienta. Dla każdego klienta tworzona jest jedna lub więcej konfiguracji MetaDapper, co stało się główną funkcją sprzedaży dla nowych klientów. Produkt można skonfigurować (za pomocą MetaDapper) w ciągu kilku minut, aby obsługiwać dowolny niestandardowy lub standardowy format pakietu księgowego, dzięki czemu integracja z podstawowymi i istniejącymi systemami jest dołączana do każdej nowej sprzedaży. Ta sama firma wykorzystuje MetaDapper w różnych projektach integracji oprogramowania, mapując i konwertując dane oraz konwertując wewnętrzne kody między swoimi systemami.

Jeden z głównych sprzedawców samochodów musiał dodać kilka raportów sprzedaży w formacie Excel do jednej ze swoich aplikacji. Raporty zostały dodane do aplikacji w niecałą godzinę – od początku do końca.

Deweloper potrzebował tabeli stanów USA identycznej z zestawem używanym na innej stronie internetowej. MetaDapper został wykorzystany do wydobycia danych z witryny i wygenerowania skryptu SQL do zapełnienia jego tabeli w ciągu kilku minut.

To tylko kilka przykładów sprawdzonej użyteczności i wartości MetaDapper jako narzędzia do mapowania danych.

Zakończyć

Aby zacząć myśleć o konwersji danych bardziej ogólnie i zacząć myśleć o zestawach danych z regułami biznesowymi i nieograniczoną użytecznością, trzeba wykonać skok mentalny. MetaDapper to framework, który wspiera i ułatwia tę perspektywę.

Niezależnie od tego, czy używasz MetaDapper, innej technologii, czy rozwijasz własne rozwiązania mapowania danych, było to wprowadzenie do niektórych złożoności i ukrytych kosztów w projektach konwersji danych. Mam nadzieję, że uznasz to za pouczające.

(Aby uzyskać więcej informacji o MetaDapper, skontaktuj się z zespołem MetaDapper pod adresem [email protected].)