MetaDapper: mappatura e conversione dei dati semplificate con gli strumenti giusti
Pubblicato: 2022-03-11La conversione, la traduzione e la mappatura dei dati non è affatto scienza missilistica, ma è assolutamente noiosa. Anche una semplice attività di conversione dei dati (ad esempio, la lettura di un file CSV in un elenco di istanze di classe) può richiedere una quantità non banale di codice. Sebbene tutte queste attività condividano molto in comune, sono tutte "abbastanza diverse" da richiedere i propri metodi di conversione dei dati.
Praticamente in ogni sistema che costruiamo, a un certo punto ci ritroveremo a dover trasformare i dati da un modulo all'altro, sia per importare dati da un archivio dati esistente, elaborare dati da un flusso in entrata, tradurre da un formato all'altro per interni elaborazione o trasformazione dei dati nel formato di output desiderato.
E ogni volta che lo facciamo, il compito sembra così frustrantemente simile a quello che abbiamo fatto così tante volte prima, ma presenta differenze appena sufficienti per richiederci di ripetere il processo di mappatura dei dati da capo, in gran parte da zero.
Inoltre, poiché i formati e le tecnologie più popolari per accedervi continuano ad evolversi e ne vengono introdotti di nuovi e guadagnano popolarità, i programmatori sono obbligati ad apprendere costantemente nuove tecniche di conversione e mappatura dei dati, librerie, API e framework. Man mano che i servizi di data science continuano a svilupparsi ed evolversi, anche la domanda di strumenti specializzati si espande.
Sebbene tu possa sfruttare strumenti come AutoMapper (per mappare i dati da un oggetto a un altro) o Resharper (per rifattorizzare il codice esistente), qualunque cosa tu faccia, il codice sarà noioso da scrivere e dovrà sempre essere mantenuto. E poi devi trovare una soluzione per la gestione della traduzione tra domini, come la conversione di codici interni e valori chiave in valori per un altro livello o sistema, valori null in valori predefiniti, conversione di tipo, ecc.
La convalida presenta problemi simili che vengono risolti da tecnologie come DataAnnotations e il plug-in di convalida jQuery e da risme di codice di convalida personalizzato. E le sfumature con ciascuna di queste tecnologie possono essere piuttosto sottili.
In qualità di data scientist avanzato, ti dici "Deve esserci un modo migliore". Ebbene, in effetti, c'è. Ed è di questo che tratta questo tutorial sulla mappatura dei dati.
Presentazione dello strumento di mappatura dei dati MetaDapper
MetaDapper è una libreria .NET che si sforza di semplificare e ottimizzare il processo di conversione dei dati nella massima misura possibile.
MetaDapper facilita la conversione dei dati:
- Disaccoppiamento delle porzioni standard ripetibili del processo di conversione dei dati da quegli aspetti che sono univoci per ciascuna attività di trasformazione dei dati.
- Fornisce un'interfaccia utente intuitiva e facile da usare per specificare regole di mappatura e traduzione di complessità arbitraria.
MetaDapper separa la mappatura logica (schema, traduzione dei dati e convalida) dalla mappatura dei dati fisici (conversione da e verso vari formati di file e API). La mappatura logica presenta un potente insieme di funzioni e ti consente di agganciare i tuoi metodi per gestire esigenze molto specifiche. La mappatura fisica include un ricco set di formati supportati che vengono costantemente estesi. Per configurare una mappatura viene fornito il MetaDapper Configurator; un eseguibile Windows semplice da usare per la creazione e la modifica di mappature e per l'esecuzione per test o conversioni una tantum.
La conversione di un elenco di istanze di classe in file XML o CSV, il popolamento di record di database SQL, la generazione di script SQL per il popolamento di tabelle, la creazione di fogli di calcolo e molto altro, viene eseguita utilizzando lo stesso file di configurazione che spesso può essere creato in pochi secondi.
Per includere MetaDapper nel tuo programma .NET, devi semplicemente:
- Aggiungi un riferimento alla libreria
- Crea un'istanza del motore MetaDapper
- Eseguire la mappatura, specificando il lettore di origine (ed eventuali parametri), lo scrittore di destinazione (ed eventuali parametri) e il file di configurazione.
In caso di successo, lo scrittore emetterà i dati trasformati. In caso di errore, un'eccezione restituirà informazioni dettagliate sull'errore in modo da poter rifiutare i dati o ottimizzare la configurazione.
Ecco un breve esempio di mappatura dei dati:
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; }
Il "Configuratore" di MetaDapper
Il MetaDapper Configurator fornisce un modo per seguire visivamente i passaggi per definire la struttura dei dati e le regole di conversione/mappatura. Il configuratore consente di creare, modificare ed eseguire configurazioni (ad es. per test o conversioni una tantum).
Il configuratore di MetaDapper si sforza di automatizzare il più possibile il processo. Ad esempio, quando si specifica una mappatura dei campi, i campi di origine e di destinazione vengono abbinati automaticamente quando possibile utilizzando la corrispondenza dei nomi. Inoltre, quando si creano definizioni di record per origini dati che contengono metadati, le definizioni dei campi possono essere popolate automaticamente puntando all'origine dati.
Una volta creata, una definizione di record mantiene il collegamento all'origine dati da cui è stata creata (se presente) in modo che possa essere aggiornata automaticamente se lo schema dell'origine dati viene successivamente modificato. Quando si configura una definizione di record per un'origine dati con pochi o nessun metadati disponibili, se è disponibile un'altra origine dati simile che contiene metadati, tale definizione di record può essere copiata (con i relativi metadati) per fungere da base per la nuova definizione di record e possono quindi essere modificati per riflettere eventuali differenze che possono esistere tra le due origini dati. E nei casi in cui lo schema e i metadati sono identici per più origini dati, è possibile utilizzare un'unica definizione di record per tutte.
Semplificazione del processo di conversione dei dati
Diamo un'occhiata più in dettaglio ad alcune delle sfide inerenti al processo di conversione dei dati e ai modi in cui MetaDapper le facilita e le semplifica per lo sviluppatore.
Mappatura dei dati da origine a destinazione
Quando una struttura interna o esterna viene modificata nel corso della manutenzione, potrebbe essere necessario modificare anche qualsiasi codice di mappatura che si basa su queste strutture. Questa è un'area in cui sono spesso richiesti lavori di manutenzione, quindi qualunque sia la soluzione utilizzata, i costi di manutenzione devono essere valutati. Ad esempio, se una proprietà TotalSale viene rimossa da una classe Sale, qualsiasi assegnazione di mappatura correlata deve essere modificata di conseguenza.
Con MetaDapper, l'aggiornamento di una mappatura può richiedere solo pochi secondi. Per un tipo di classe, ad esempio, fai semplicemente clic sul pulsante "Importa definizioni di campo dalla classe" per aggiornare i campi alla definizione appena compilata:
Digita la conversione
Alcune conversioni di tipo, ad esempio le conversioni di tipo Data/Ora e Numero, sono sensibili alle impostazioni internazionali dell'ambiente host (a meno che non sia specificato esplicitamente nel codice). La distribuzione di un'applicazione su un nuovo server con impostazioni internazionali diverse può quindi interrompere il codice che non ne tiene conto. Un valore di data "1-2-2014", ad esempio, verrà interpretato come 2 gennaio 2014 in una macchina con impostazioni USA, ma come 1 febbraio 2014 su una macchina con impostazioni per il Regno Unito. MetaDapper supporta tutte le conversioni .NET implicite e consente anche una complessa riformattazione dei valori come parte della traduzione. Inoltre, è possibile specificare impostazioni internazionali separate (cioè indipendenti) nei lettori MetaDapper, nei writer e nel motore di mappatura.
Valori predefiniti complessi
A volte sono necessarie regole aziendali specifiche che richiedono l'accesso ad altri sistemi o richiedono una codifica complessa per determinare un valore predefinito. MetaDapper consente di registrare un numero qualsiasi di metodi delegati personalizzati con il motore e utilizzarli per fornire valori predefiniti, eseguire conversioni di dati personalizzate e fornire la convalida dei campi personalizzati.
Regole di convalida condizionale
Non è raro che i valori dei campi siano obbligatori in modo condizionale (o anche che i loro valori validi dipendano dai valori di altri campi). Ad esempio, potrebbe accadere che i campi Nome partner e Codice di previdenza sociale del partner possano essere lasciati vuoti, ma se viene fornito un nome di partner, è necessario fornire il Codice di previdenza sociale del partner (ed eventualmente altri campi). Questo tipo di convalida condizionale è complesso ed è facile sbagliare nel codice personalizzato. Al contrario, MetaDapper consente di configurare facilmente questo tipo di relazione di mappatura dei dati. In particolare, un elenco di campi in una definizione record può essere elencato in un gruppo di campi obbligatori condizionali:

Quindi in una mappatura, il gruppo può essere associato a qualsiasi campo che, se non nullo, richiederebbe a sua volta di fornire tutti i campi del gruppo. Per esempio:
Conversione di valori mappati tra domini
I dati di origine possono contenere valori incoerenti. Ad esempio, un campo di saluto può contenere "Mr.", "Mr", "MR.", "Mister" o "M" oltre a tutti gli equivalenti femminili. Oppure un campo di valuta può contenere un valore come "$" mentre il formato di destinazione richiede "USD". I codici prodotto sono un altro esempio di valori che potrebbero dover essere convertiti da un sistema all'altro. MetaDapper consente la specifica di "liste di sinonimi" riutilizzabili che possono essere utilizzate per tradurre i valori durante le mappature.
Una volta definito, puoi specificare il gruppo di sinonimi per utilizzarlo in qualsiasi mappatura dei campi pertinente:
Mappature basate sulla formattazione dei valori e calcoli complessi
Potrebbe essere necessario utilizzare i valori di uno o più campi per formattare un nuovo valore. Ad esempio, potrebbe essere necessario decorare il valore di origine con costanti (ad es. sale.PriceEach = "$" + priceEach;
) o potrebbe essere necessario utilizzare più campi per generare un valore (ad es. sale.Code = code1 + “_” + code2;
).
MetaDapper fornisce una capacità di formattazione/modellazione che ti consente di creare valori utilizzando qualsiasi campo nel record corrente, comprese porzioni di sottostringa di campi o valori costanti. Dopo la formattazione, il valore verrà convertito nel tipo di destinazione specificato (che, per inciso, non deve essere necessariamente una stringa).
Allo stesso modo, durante le mappature è possibile eseguire calcoli complessi, utilizzando un set completo di operatori e funzioni matematiche su qualsiasi combinazione di valori di campo e costanti.
Regole di convalida
I delegati di convalida personalizzati possono essere registrati e utilizzati nelle mappature. Ecco un esempio di un metodo personalizzato per convalidare che un valore di campo è un intero (senza rendere il tipo di dati per il campo un intero):
private static bool ValidateIsInteger( Log log, CultureInfo cultureInfo, object value, ref List<ErrorInfo> errors) { try { Convert.ToInt32(value); } catch (Exception) { return false; } return true; }
Il metodo verrebbe registrato durante l'istanza di MetaDapper. Quindi potrebbe essere facilmente applicato in qualsiasi definizione di mappatura dei campi:
Raggruppamento, ordinamento e filtraggio
Le operazioni di raggruppamento e ordinamento possono spesso essere gestite in una query di database, ma non tutte le origini dati sono database. MetaDapper supporta quindi la configurazione di complesse operazioni di raggruppamento e ordinamento che possono essere eseguite in memoria.
Nei casi in cui potrebbe essere necessaria solo una parte dei dati di origine, il filtraggio da fonti non di database può essere molto complesso da implementare e mantenere. MetaDapper supporta la configurazione di filtri complessi con operatori booleani per qualsiasi numero di valutazioni di campo per record, con nidificazione arbitraria delle operazioni secondo necessità. Per esempio:
Il filtro precedente è equivalente al seguente codice C#:
if (sale.TransactionID > “0” AND sale.Currency == “USD” AND (sale.Amount > “3” || sale.Amount == “1”)
Mappature nidificate
Alcune mappature richiedono più passaggi per completare il processo di conversione dei dati. Alcuni esempi includono dati che richiedono record di prefisso o sommatoria, dati che devono essere mappati in modo diverso a seconda dei valori dei campi o della struttura del documento, o semplicemente per isolare diverse fasi di una mappatura complessa (ad es. tradurre nomi, tipi di conversioni, ecc.). A tal fine, MetaDapper supporta mappature nidificate a qualsiasi livello di profondità.
Formato vs. struttura
Come strumento di mappatura e conversione dei dati, MetaDapper è costruito per consentire la lettura o la scrittura di praticamente qualsiasi formato di dati utilizzando interfacce di lettura e scrittura interne. Ciò consente la creazione di classi di lettori/scrittori estremamente leggere e incentrate solo sulle sfumature specifiche del formato.
Anche i lettori e gli scrittori si comportano nel modo più intelligente e flessibile possibile. Ad esempio, il lettore e lo scrittore XML utilizzano XPath per specificare dove recuperare o scrivere i dati in un file XML. La stessa configurazione può essere utilizzata anche per leggere e scrivere, ad esempio, da formati non XML (come file CSV), nel qual caso i valori XPath verranno semplicemente ignorati. Allo stesso modo, se una configurazione che non include le impostazioni XPath viene utilizzata con un lettore o un writer XML, verrà generato un errore.
Sì. Destra. Sicuro. (Alcuni esempi di mappatura di dati reali)
Sei scettico. E non ti biasimo. Gli strumenti software sono raramente tutto ciò che affermano di essere. Quindi ecco alcuni esempi del mondo reale in cui MetaDapper è già stato utilizzato per fornire vantaggi operativi.
Un'azienda che fornisce software per la gestione delle assicurazioni mediche aveva clienti che non volevano compilare moduli web ma volevano fornire i propri dati in fogli di calcolo. Utilizzando MetaDapper, i fogli di calcolo caricati vengono letti in memoria, i dati puliti, i record convalidati e i risultati archiviati nel loro database. Sono in grado di accettare file Excel dai loro clienti senza alcuna convalida umana utilizzando MetaDapper con un file di configurazione facile da creare per ogni modello di foglio di calcolo che pubblicano.
Una grande azienda del gas ha un'applicazione interna e desiderava che i propri utenti di gestione potessero scaricare i report in formato Excel. I formati dei rapporti verrebbero probabilmente modificati regolarmente. MetaDapper ha facilitato la generazione di fogli Excel dal loro database. L'aggiornamento dei formati Excel richiedeva solo l'aggiornamento dei file di configurazione MetaDapper senza alcuna modifica del codice o ricompilazione.
Un'azienda che fornisce software per la gestione delle risorse necessitava di una soluzione per generare dati finanziari nei formati dei pacchetti di contabilità dipendenti dal cliente da importare in tali sistemi. È stata sviluppata una query di dati contabili generici utilizzando un wrapper ORM e MetaDapper è stato utilizzato per ordinare, filtrare e mappare i dati nello schema e nel formato desiderati per ciascun cliente. Per ogni cliente vengono realizzate una o più configurazioni MetaDapper e questa è diventata una delle principali funzionalità di vendita per i nuovi clienti. Il prodotto può essere configurato (utilizzando MetaDapper) in pochi minuti per supportare qualsiasi formato di pacchetto di contabilità personalizzato o standard, quindi l'integrazione con i sistemi essenziali ed esistenti è inclusa in ogni nuova vendita. La stessa azienda utilizza MetaDapper in vari progetti di integrazione software, mappando e convertendo dati e convertendo codici interni tra i loro sistemi.
Un importante rivenditore di auto aveva bisogno di aggiungere alcuni rapporti di vendita in formato Excel a una delle sue applicazioni. I report sono stati aggiunti all'applicazione in meno di un'ora, dall'inizio alla fine.
Uno sviluppatore aveva bisogno di una tabella degli Stati Uniti identica al set utilizzato su un altro sito web. MetaDapper è stato utilizzato per estrarre i dati dal sito e generare uno script SQL per popolare la sua tabella in pochi minuti.
Questi sono solo alcuni esempi della comprovata utilità e valore di MetaDapper come strumento di mappatura dei dati.
Incartare
Ci vuole un salto mentale per iniziare a pensare alla conversione dei dati in modo più generico e per iniziare a pensare a insiemi di dati con regole di business e utilità illimitata. MetaDapper è un framework che promuove e facilita quella prospettiva.
Sia che utilizzi MetaDapper, un'altra tecnologia, sia che utilizzi le tue soluzioni di mappatura dei dati, questa è stata un'introduzione ad alcune delle complessità e dei costi nascosti nei progetti di conversione dei dati. Spero che lo trovi informativo.
(Per ulteriori informazioni su MetaDapper, contattare il team MetaDapper all'indirizzo [email protected].)