MetaDapper: asignación y conversión de datos simplificada con las herramientas adecuadas
Publicado: 2022-03-11La conversión, traducción y mapeo de datos no es ciencia espacial, pero sí tedioso. Incluso una tarea simple de conversión de datos (p. ej., leer un archivo CSV en una lista de instancias de clase) puede requerir una cantidad de código no trivial. Si bien todas estas tareas tienen mucho en común, todas son "lo suficientemente diferentes" como para requerir sus propios métodos de conversión de datos.
En prácticamente todos los sistemas que construimos, en algún momento nos veremos en la necesidad de transformar los datos de una forma a otra, ya sea para importar datos de un almacén de datos existente, procesar datos de un flujo entrante, traducir de un formato a otro para fines internos. procesamiento o transformación de datos a un formato de salida deseado.
Y cada vez que lo hacemos, la tarea parece tan frustrantemente similar a lo que hemos hecho tantas veces antes, pero tiene suficientes diferencias como para requerir que hagamos el proceso de mapeo de datos nuevamente, en gran parte desde cero.
Además, a medida que los formatos y tecnologías más populares para acceder a ellos continúan evolucionando, y se introducen nuevos y ganan popularidad, los programadores se ven obligados a aprender constantemente nuevas técnicas de conversión y mapeo de datos, bibliotecas, API y marcos. A medida que los servicios de ciencia de datos continúan desarrollándose y evolucionando, la demanda de herramientas especializadas también se expande.
Aunque puede aprovechar herramientas como AutoMapper (para mapear datos de un objeto a otro) o Resharper (para refactorizar el código existente), sin importar lo que haga, el código será tedioso de escribir y siempre deberá mantenerse. Y luego debe encontrar una solución para el manejo de la traducción entre dominios, como convertir códigos internos y valores clave en valores para otra capa o sistema, valores nulos en valores predeterminados, conversión de tipo, etc.
La validación tiene problemas similares que son abordados por tecnologías como DataAnnotations y el complemento jQuery Validation y por resmas de código de validación personalizado. Y los matices con cada una de estas tecnologías pueden ser bastante sutiles.
Como científico de datos avanzado, te dices a ti mismo: "Tiene que haber una mejor manera". Bueno, de hecho, lo hay. Y de eso se trata este tutorial de mapeo de datos.
Presentamos la herramienta de mapeo de datos MetaDapper
MetaDapper es una biblioteca .NET que se esfuerza por simplificar y agilizar el proceso de conversión de datos en la mayor medida posible.
MetaDapper facilita la conversión de datos al:
- Separar las partes repetitivas repetitivas del proceso de conversión de datos de aquellos aspectos que son exclusivos de cada tarea de transformación de datos.
- Proporciona una interfaz de usuario intuitiva y fácil de usar para especificar reglas de traducción y mapeo de complejidad arbitraria.
MetaDapper separa el mapeo lógico (esquema, traducción de datos y validación) del mapeo de datos físicos (conversión hacia y desde varios formatos de archivo y API). El mapeo lógico presenta un poderoso conjunto de funciones y le permite conectar sus propios métodos para manejar necesidades muy específicas. El mapeo físico incluye un amplio conjunto de formatos admitidos que se amplían constantemente. Para configurar un mapeo, se proporciona el Configurador MetaDapper; un ejecutable de Windows fácil de usar para crear y editar asignaciones, y para ejecutarlas para pruebas o para conversiones únicas.
La conversión de una lista de instancias de clase a archivos XML o CSV, el llenado de registros de bases de datos SQL, la generación de secuencias de comandos SQL para completar tablas, la creación de hojas de cálculo y mucho más, todo se realiza utilizando el mismo archivo de configuración que a menudo se puede crear en segundos.
Para incluir MetaDapper en su programa .NET, simplemente necesita:
- Agregar una referencia a la biblioteca
- Crear una instancia del motor MetaDapper
- Ejecute la asignación, especificando el lector de origen (y cualquier parámetro), el escritor de destino (y cualquier parámetro) y su archivo de configuración.
En caso de éxito, el escritor generará los datos transformados. En caso de error, una excepción devolverá información detallada del error para que pueda rechazar los datos o ajustar la configuración.
Aquí hay un breve ejemplo de mapeo de datos:
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; }
El “Configurador” de MetaDapper
El Configurador MetaDapper proporciona una forma de recorrer visualmente los pasos para definir su estructura de datos y reglas de conversión/mapeo. El Configurador le permite crear, editar y ejecutar configuraciones (es decir, para pruebas o conversiones únicas).
El Configurador de MetaDapper se esfuerza por automatizar la mayor parte del proceso posible. Por ejemplo, al especificar una asignación de campo, los campos de origen y destino se comparan automáticamente cuando es posible mediante la coincidencia de nombres. Además, al crear definiciones de registros para fuentes de datos que contienen metadatos, las definiciones de campo se pueden completar automáticamente señalando la fuente de datos.
Una vez creada, una definición de registro mantiene su vínculo con la fuente de datos a partir de la cual se creó (si corresponde) para que pueda actualizarse automáticamente si el esquema de la fuente de datos cambia posteriormente. Al configurar una definición de registro para una fuente de datos con pocos o ningún metadato disponible, si hay otra fuente de datos similar disponible que contiene metadatos, esa definición de registro se puede copiar (con sus metadatos) para que sirva como base para la nueva definición de registro y luego se puede editar para reflejar cualquier diferencia que pueda existir entre las dos fuentes de datos. Y en los casos en que el esquema y los metadatos sean idénticos para varias fuentes de datos, se puede usar una única definición de registro para todos ellos.
Simplificando el proceso de conversión de datos
Veamos con más detalle algunos de los desafíos inherentes al proceso de conversión de datos y las formas en que MetaDapper los facilita y simplifica para el desarrollador.
Asignación de datos de origen a destino
Cuando se cambia una estructura interna o externa durante el mantenimiento, es posible que también sea necesario ajustar cualquier código de mapeo que se base en estas estructuras. Esta es un área en la que a menudo se requiere trabajo de mantenimiento, por lo que sea cual sea la solución que utilice, es necesario evaluar los costos de mantenimiento. Por ejemplo, si se elimina una propiedad VentaTotal de una clase Venta, cualquier asignación de asignación relacionada debe ajustarse en consecuencia.
Con MetaDapper, la actualización de un mapeo puede tomar tan solo unos segundos. Para un tipo de clase, por ejemplo, simplemente haga clic en el botón "Importar definiciones de campo de la clase" para actualizar los campos a la definición recién compilada:
Tipo de conversión
Algunas conversiones de tipo, como las conversiones de tipo Fecha/Hora y Número, por ejemplo, son sensibles a la configuración internacional del entorno host (a menos que se especifique explícitamente en el código). Por lo tanto, implementar una aplicación en un nuevo servidor con diferentes configuraciones internacionales puede romper el código que no tiene esto en cuenta. Un valor de fecha de "1-2-2014", por ejemplo, se interpretará como 2 de enero de 2014 en una máquina con configuración de EE. UU., pero como 1 de febrero de 2014 en una máquina con configuración de Reino Unido. MetaDapper es compatible con todas las conversiones implícitas de .NET y también permite el reformateo complejo de valores como parte de la traducción. Además, se pueden especificar configuraciones internacionales separadas (es decir, independientes) en los lectores, escritores y el motor de mapeo de MetaDapper.
Valores predeterminados complejos
A veces, se necesitan reglas comerciales específicas que requieren acceso a otros sistemas o requieren una codificación compleja para determinar un valor predeterminado. MetaDapper permite registrar cualquier número de métodos delegados personalizados con el motor y emplearlos para proporcionar valores predeterminados, realizar conversiones de datos personalizados y proporcionar validación de campos personalizados.
Reglas de validación condicional
No es raro que los valores de los campos se requieran condicionalmente (o incluso que sus valores válidos dependan de los valores de otros campos). Por ejemplo, podría darse el caso de que los campos Nombre del socio y Código de seguridad social del socio se dejen en blanco, pero si se proporciona un Nombre de socio, entonces se debe proporcionar el Código de seguridad social del socio (y posiblemente otros campos). Este tipo de validación condicional es complejo y es fácil equivocarse en el código personalizado. Por el contrario, MetaDapper permite configurar fácilmente este tipo de relación de mapeo de datos. Específicamente, una lista de campos en una definición de registro se puede incluir en un grupo de campos obligatorios condicionales:

Luego, en una asignación, el grupo se puede asociar con cualquier campo que, si no es nulo, a su vez requerirá que se proporcionen todos los campos del grupo. Por ejemplo:
Conversión de valores asignados entre dominios
Los datos de origen pueden contener valores incoherentes. Por ejemplo, un campo de saludo puede contener "Señor", "Señor", "Señor", "Señor" o "M", así como todos los equivalentes femeninos. O un campo de moneda puede contener un valor como "$" mientras que su formato de destino requiere "USD". Los códigos de producto son otro ejemplo de valores que pueden necesitar convertirse de un sistema a otro. MetaDapper permite la especificación de "listas de sinónimos" reutilizables que se pueden usar para traducir valores durante las asignaciones.
Una vez definido, puede especificar el grupo de sinónimos para emplearlo en cualquier asignación de campo relevante:
Asignaciones basadas en formato de valor y cálculos complejos
Es posible que sea necesario usar valores de uno o más campos para dar formato a un nuevo valor. Por ejemplo, es posible que sea necesario decorar el valor de origen con constantes (p. ej., sale.PriceEach = "$" + priceEach;
) o es posible que se deban usar varios campos para generar un valor (p. ej., sale.Code = code1 + “_” + code2;
).
MetaDapper proporciona una capacidad de formato/plantilla que le permite generar valores usando cualquiera de los campos en el registro actual, incluidas las porciones de subcadenas de campos o valores constantes. Después de formatear, el valor se convertirá al tipo de destino especificado (que, dicho sea de paso, no necesita ser una cadena).
De manera similar, se pueden realizar cálculos complejos durante las asignaciones, empleando un conjunto completo de operadores matemáticos y funciones en cualquier combinación de valores de campo y constantes.
Reglas de validación
Los delegados de validación personalizados se pueden registrar y utilizar en las asignaciones. Este es un ejemplo de un método personalizado para validar que el valor de un campo es un número entero (sin hacer que el tipo de datos del campo sea un número entero):
private static bool ValidateIsInteger( Log log, CultureInfo cultureInfo, object value, ref List<ErrorInfo> errors) { try { Convert.ToInt32(value); } catch (Exception) { return false; } return true; }
El método se registraría al instanciar MetaDapper. Entonces podría aplicarse fácilmente en cualquier definición de mapeo de campo:
Agrupación, clasificación y filtrado
Las operaciones de agrupación y clasificación a menudo se pueden manejar en una consulta de base de datos, pero no todas las fuentes de datos son bases de datos. Por lo tanto, MetaDapper admite la configuración de operaciones complejas de agrupación y clasificación que se pueden realizar en la memoria.
En los casos en los que solo se necesite una parte de los datos de origen, el filtrado de fuentes que no sean de base de datos puede ser muy complejo de implementar y mantener. MetaDapper admite la configuración de filtros complejos con operadores booleanos para cualquier cantidad de evaluaciones de campo por registro, con operaciones anidadas arbitrariamente profundas según sea necesario. Por ejemplo:
El filtro anterior es equivalente al siguiente código C#:
if (sale.TransactionID > “0” AND sale.Currency == “USD” AND (sale.Amount > “3” || sale.Amount == “1”)
Asignaciones anidadas
Algunas asignaciones requieren varias pasadas para completar el proceso de conversión de datos. Algunos ejemplos incluyen datos que requieren registros de suma o prefijo, datos que deben asignarse de manera diferente según los valores de los campos o la estructura del documento, o simplemente para aislar diferentes etapas de un mapeo complejo (es decir, traducir nombres, convertir tipos, etc.). Con ese fin, MetaDapper admite mapeos anidados en cualquier nivel de profundidad.
Formato vs estructura
Como herramienta de mapeo y conversión de datos, MetaDapper está diseñado para permitir que se lea o escriba prácticamente cualquier formato de datos utilizando interfaces internas de lectura y escritura. Esto permite la creación de clases de lector/escritor que son extremadamente ligeras y se centran únicamente en los matices específicos del formato.
Los lectores y escritores también se comportan de la manera más inteligente y flexible posible. Por ejemplo, el lector y el escritor de XML emplean XPaths para especificar dónde recuperar o escribir datos en un archivo XML. La misma configuración también se puede usar para leer y escribir, por ejemplo, desde formatos que no sean XML (como archivos CSV), en cuyo caso los valores de XPath simplemente se ignorarán. Asimismo, si se utiliza una configuración que no incluye la configuración de XPath con un lector o escritor de XML, se generará un error.
Si. Derecha. Por supuesto. (Algunos ejemplos de mapeo de datos reales)
Eres escéptico. Y no te culpo. Las herramientas de software rara vez son todo lo que dicen ser. Así que aquí hay algunos ejemplos del mundo real en los que MetaDapper ya se ha utilizado para proporcionar un beneficio operativo.
Una empresa que proporciona software de gestión de seguros médicos tenía clientes que no querían rellenar formularios web pero querían proporcionar sus datos en hojas de cálculo. Con MetaDapper, las hojas de cálculo cargadas se leen en la memoria, se limpian los datos, se validan los registros y los resultados se almacenan en su base de datos. Pueden aceptar archivos de Excel de sus clientes sin ninguna validación humana utilizando MetaDapper con un archivo de configuración fácil de crear para cada plantilla de hoja de cálculo que publican.
Una gran empresa de gas tiene una aplicación interna y quería que sus usuarios de gestión pudieran descargar informes en formato Excel. Es probable que los formatos de los informes se cambien periódicamente. MetaDapper facilitó que se generaran hojas de Excel a partir de su base de datos. Actualizar los formatos de Excel solo requería actualizar los archivos de configuración de MetaDapper sin ningún cambio de código ni recompilación.
Una empresa que proporciona software de gestión de activos necesitaba una solución para generar datos financieros en formatos de paquetes de contabilidad dependientes del cliente para importarlos a esos sistemas. Se desarrolló una consulta de datos de contabilidad genérica usando un envoltorio ORM y se usó MetaDapper para ordenar, filtrar y mapear datos en el esquema y formato deseado para cada cliente. Se realizan una o más configuraciones de MetaDapper para cada cliente y esto se ha convertido en una característica de venta importante para los nuevos clientes. El producto se puede configurar (mediante MetaDapper) en minutos para admitir cualquier formato de paquete de contabilidad personalizado o estándar, de modo que la integración con los sistemas esenciales y existentes se incluya con cada nueva venta. La misma empresa utiliza MetaDapper en varios proyectos de integración de software, asignando y convirtiendo datos y convirtiendo códigos internos entre sus sistemas.
Un importante distribuidor de automóviles necesitaba agregar algunos informes de ventas en formato Excel a una de sus aplicaciones. Los informes se agregaron a la aplicación en menos de una hora, de principio a fin.
Un desarrollador necesitaba una tabla de estados de EE. UU. idéntica al conjunto utilizado en otro sitio web. MetaDapper se utilizó para extraer los datos del sitio y generar un script SQL para completar su tabla en unos minutos.
Estos son solo algunos ejemplos de la utilidad y el valor comprobados de MetaDapper como herramienta de mapeo de datos.
Envolver
Se necesita un salto mental para comenzar a pensar en la conversión de datos de manera más genérica y comenzar a pensar en conjuntos de datos con reglas comerciales y una utilidad ilimitada. MetaDapper es un marco que fomenta y facilita esa perspectiva.
Ya sea que use MetaDapper, otra tecnología o implemente sus propias soluciones de mapeo de datos, esta ha sido una introducción a parte de la complejidad y los costos ocultos en los proyectos de conversión de datos. Espero que lo hayas encontrado informativo.
(Para obtener más información sobre MetaDapper, comuníquese con el equipo de MetaDapper en [email protected]).