MetaDapper: простое сопоставление и преобразование данных с помощью правильных инструментов
Опубликовано: 2022-03-11Преобразование данных, перевод и картографирование ни в коем случае не являются ракетостроением, но это, безусловно, утомительно. Даже простая задача преобразования данных (например, чтение CSV-файла в список экземпляров класса) может потребовать нетривиального объема кода. Хотя все эти задачи имеют много общего, все они «достаточно разные», чтобы требовать собственных методов преобразования данных.
Практически в каждой системе, которую мы создаем, нам в какой-то момент придется преобразовывать данные из одной формы в другую, будь то для импорта данных из существующего хранилища данных, обработки данных из входящего потока, перевода из одного формата в другой для внутренних нужд. обработка или преобразование данных в желаемый выходной формат.
И каждый раз, когда мы это делаем, задача кажется досадно похожей на то, что мы уже делали много раз раньше, но в то же время имеет достаточно отличий, чтобы потребовать от нас повторного процесса отображения данных, в основном с нуля.
Более того, поскольку наиболее популярные форматы и технологии доступа к ним продолжают развиваться, а новые внедряются и набирают популярность, программисты обязаны постоянно изучать новые методы преобразования и отображения данных, библиотеки, API и фреймворки. По мере того, как службы обработки данных продолжают развиваться и развиваться, спрос на специализированные инструменты также растет.
Хотя вы можете использовать такие инструменты, как AutoMapper (для сопоставления данных одного объекта с другим) или Resharper (для рефакторинга существующего кода), независимо от того, что вы делаете, код будет утомительным для написания, и его всегда нужно будет поддерживать. Затем вам нужно придумать решение для обработки междоменных переводов — например, преобразование внутренних кодов и значений ключей в значения для другого уровня или системы, нулевых значений в значения по умолчанию, преобразование типов и т. д.
У проверки есть аналогичные проблемы, которые решаются с помощью таких технологий, как DataAnnotations и подключаемый модуль jQuery Validation, а также с помощью множества настраиваемого кода проверки. И нюансы с каждой из этих технологий могут быть весьма тонкими.
Как продвинутый специалист по данным, вы говорите себе: «Должен быть лучший способ». Ну, на самом деле, есть. И это то, о чем этот учебник по отображению данных.
Представляем инструмент сопоставления данных MetaDapper
MetaDapper — это библиотека .NET, которая стремится максимально упростить и оптимизировать процесс преобразования данных.
MetaDapper упрощает преобразование данных за счет:
- Отделение повторяющихся шаблонных частей процесса преобразования данных от тех аспектов, которые уникальны для каждой задачи преобразования данных.
- Предоставление простого в использовании, интуитивно понятного пользовательского интерфейса для указания правил сопоставления и преобразования произвольной сложности.
MetaDapper отделяет логическое сопоставление (схема, преобразование данных и проверка) от физического сопоставления данных (преобразование в различные форматы файлов и API и обратно). Логическое отображение обладает мощным набором функций и позволяет вам подключать свои собственные методы для удовлетворения очень специфических потребностей. Физическое отображение включает богатый набор поддерживаемых форматов, которые постоянно расширяются. Для настройки отображения предоставляется Конфигуратор MetaDapper; простой в использовании исполняемый файл Windows для создания и редактирования сопоставлений, а также для их выполнения для тестирования или одноразовых преобразований.
Преобразование списка экземпляров класса в файлы XML или CSV, заполнение записей базы данных SQL, создание сценариев SQL для заполнения таблиц, создание электронных таблиц и многое другое выполняется с использованием одного и того же файла конфигурации, который часто можно создать за считанные секунды.
Чтобы включить MetaDapper в вашу программу .NET, вам просто нужно:
- Добавить ссылку на библиотеку
- Создайте экземпляр движка MetaDapper
- Выполните сопоставление, указав исходный модуль чтения (и любые параметры), целевой модуль записи (и любые параметры) и файл конфигурации.
В случае успеха модуль записи выведет преобразованные данные. В случае ошибки исключение вернет подробную информацию об ошибке, чтобы вы могли отклонить данные или настроить конфигурацию.
Вот краткий пример сопоставления данных:
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; }
«Конфигуратор» MetaDapper
Конфигуратор MetaDapper позволяет визуально пройти этапы определения структуры данных и правил преобразования/сопоставления. Конфигуратор позволяет создавать, редактировать и выполнять конфигурации (например, для тестирования или разовых преобразований).
Конфигуратор MetaDapper стремится максимально автоматизировать процесс. Например, при указании сопоставления полей исходное и целевое поля сопоставляются автоматически, если это возможно с помощью сопоставления имен. Кроме того, при создании определений записей для источников данных, содержащих метаданные, определения полей можно заполнить автоматически, указав на источник данных.
После создания определение записи сохраняет свою ссылку на источник данных, из которого оно было создано (если есть), поэтому его можно автоматически обновлять, если впоследствии схема источника данных изменится. При настройке определения записи для источника данных с небольшим количеством метаданных или без них, если доступен другой аналогичный источник данных, содержащий метаданные, это определение записи может быть скопировано (с его метаданными), чтобы служить основой для нового определения записи и затем можно отредактировать, чтобы отразить любые различия, которые могут существовать между двумя источниками данных. А в случаях, когда схема и метаданные идентичны для нескольких источников данных, для них всех можно использовать одно определение записи.
Упрощение процесса преобразования данных
Давайте более подробно рассмотрим некоторые проблемы, присущие процессу преобразования данных, и способы, с помощью которых MetaDapper облегчает и упрощает их для разработчика.
Сопоставление источника с целевыми данными
Когда внутренняя или внешняя структура изменяется в ходе обслуживания, может также потребоваться корректировка любого кода отображения, который опирается на эти структуры. Это область, где часто требуются работы по техническому обслуживанию, поэтому, какое бы решение вы ни использовали, необходимо оценить затраты на техническое обслуживание. Например, если свойство TotalSale удалено из класса Sale, необходимо соответствующим образом скорректировать все связанные сопоставления.
С MetaDapper обновление сопоставления может занять всего несколько секунд. Например, для типа класса просто нажмите кнопку «Импортировать определения полей из класса», чтобы обновить поля до вновь скомпилированного определения:
Преобразование типов
Некоторые преобразования типов, например преобразования типа Дата/время и Число, чувствительны к международным параметрам среды хоста (если это явно не указано в коде). Таким образом, развертывание приложения на новом сервере с другими международными настройками может привести к поломке кода, который не учитывает это. Значение даты «1-2-2014», например, будет интерпретироваться как 2 января 2014 года на машине с настройками для США, но как 1 февраля 2014 года на машине с настройками для Великобритании. MetaDapper поддерживает все неявные преобразования .NET, а также позволяет выполнять сложное переформатирование значений как часть преобразования. Кроме того, отдельные (т.е. независимые) международные настройки могут быть указаны в программах чтения, записи и механизма отображения MetaDapper.
Сложные значения по умолчанию
Иногда требуются определенные бизнес-правила, которые требуют доступа к другим системам или требуют сложного кодирования для определения значения по умолчанию. MetaDapper позволяет зарегистрировать в движке любое количество пользовательских методов делегата и использовать их для предоставления значений по умолчанию, выполнения настраиваемого преобразования данных и обеспечения проверки настраиваемых полей.
Правила условной проверки
Нередко значения полей требуются условно (или даже их допустимые значения зависят от значений других полей). Например, может быть так, что поля «Имя партнера» и «Код социального обеспечения партнера» можно оставить пустыми, но если указано имя партнера, то необходимо указать «Код социального обеспечения партнера» (и, возможно, другие поля). Этот тип условной проверки сложен, и в пользовательском коде легко ошибиться. В отличие от этого, MetaDapper позволяет легко настраивать такие отношения сопоставления данных. В частности, список полей в определении записи может быть указан в группе условных обязательных полей:

Затем в сопоставлении группа может быть связана с любым полем, которое, если оно не равно нулю, в свою очередь потребует предоставления всех полей в группе. Например:
Преобразование сопоставленных значений между доменами
Исходные данные могут содержать несогласованные значения. Например, поле приветствия может содержать «мистер», «мистер», «мистер», «мистер» или «м», а также все женские эквиваленты. Или поле валюты может содержать значение, такое как «$», в то время как для вашего целевого формата требуется «USD». Коды продуктов — еще один пример значений, которые, возможно, потребуется преобразовать из одной системы в другую. MetaDapper позволяет задавать повторно используемые «списки синонимов», которые можно использовать для преобразования значений во время сопоставлений.
После определения вы можете указать группу синонимов, чтобы использовать ее в любом соответствующем сопоставлении полей:
Сопоставления на основе форматирования значений и сложных вычислений
Значения из одного или нескольких полей могут потребоваться для форматирования нового значения. Например, исходное значение может нуждаться в украшении константами (например, sale.PriceEach = "$" + priceEach;
) или может потребоваться использование нескольких полей для генерации значения (например, sale.Code = code1 + “_” + code2;
).
MetaDapper предоставляет возможность форматирования/шаблона, которая позволяет вам создавать значения, используя любые поля в текущей записи, включая подстроки полей или постоянные значения. После форматирования значение будет преобразовано в указанный целевой тип (который, кстати, не обязательно должен быть строкой).
Точно так же сложные вычисления могут выполняться во время отображения, используя полный набор математических операторов и функций для любой комбинации значений полей и констант.
Правила проверки
Пользовательские делегаты проверки можно зарегистрировать и использовать в сопоставлениях. Вот пример пользовательского метода для проверки того, что значение поля является целым числом (без преобразования типа данных для поля в целое число):
private static bool ValidateIsInteger( Log log, CultureInfo cultureInfo, object value, ref List<ErrorInfo> errors) { try { Convert.ToInt32(value); } catch (Exception) { return false; } return true; }
Метод будет зарегистрирован при создании экземпляра MetaDapper. Затем его можно было бы легко применить в любом определении сопоставления полей:
Группировка, сортировка и фильтрация
Операции группировки и сортировки часто можно обрабатывать в запросе к базе данных, но не все источники данных являются базами данных. Таким образом, MetaDapper поддерживает настройку сложных операций группировки и сортировки, которые могут выполняться в памяти.
В тех случаях, когда может потребоваться только часть исходных данных, фильтрация из источников, не относящихся к базам данных, может быть очень сложной для реализации и обслуживания. MetaDapper поддерживает настройку сложных фильтров с логическими операторами для любого количества оценок полей на запись с произвольной глубиной вложенности операций по мере необходимости. Например:
Приведенный выше фильтр эквивалентен следующему коду C#:
if (sale.TransactionID > “0” AND sale.Currency == “USD” AND (sale.Amount > “3” || sale.Amount == “1”)
Вложенные сопоставления
Некоторые сопоставления требуют нескольких проходов для завершения процесса преобразования данных. Некоторые примеры включают данные, для которых требуются префиксные записи или записи суммирования, данные, которые необходимо отображать по-разному в зависимости от значений полей или структуры документа, или просто для изоляции различных этапов сложного отображения (например, перевод имен, преобразование типов и т. д.). С этой целью MetaDapper поддерживает вложенные отображения на любой уровень глубины.
Формат против структуры
Как инструмент сопоставления и преобразования данных, MetaDapper сконструирован таким образом, что позволяет считывать или записывать данные практически в любом формате с использованием внутренних интерфейсов чтения и записи. Это позволяет создавать классы чтения/записи, которые чрезвычайно легки и сосредоточены только на нюансах, специфичных для формата.
Читатели и писатели также ведут себя максимально разумно и гибко. Например, модуль чтения и записи XML использует XPath, чтобы указать, куда извлекать или записывать данные в XML-файле. Эту же конфигурацию можно также использовать для чтения и записи, например, из форматов, отличных от XML (таких как файлы CSV), и в этом случае значения XPath будут просто игнорироваться. Аналогичным образом, если конфигурация, которая не включает параметры XPath, используется со средством чтения или записи XML, будет сгенерирована ошибка.
Да. Верно. Конечно. (Некоторые примеры сопоставления реальных данных)
Вы настроены скептически. И я не виню тебя. Программные инструменты редко бывают тем, на что они претендуют. Итак, вот несколько реальных примеров, когда MetaDapper уже использовался для обеспечения эксплуатационных преимуществ.
У компании, поставляющей программное обеспечение для управления медицинским страхованием, были клиенты, которые не хотели заполнять веб-формы, а хотели предоставлять свои данные в электронных таблицах. Используя MetaDapper, загруженные электронные таблицы считываются в память, данные очищаются, записи проверяются, а результаты сохраняются в их базе данных. Они могут принимать файлы Excel от своих клиентов без какой-либо проверки человеком, используя MetaDapper с простым созданием файла конфигурации для каждого публикуемого ими шаблона электронной таблицы.
У крупной газовой компании есть внутреннее приложение, и она хотела, чтобы ее управленческие пользователи могли загружать отчеты в формате Excel. Форматы отчетов, вероятно, будут регулярно меняться. MetaDapper упростил создание листов Excel из своей базы данных. Обновление форматов Excel требовало только обновления файлов конфигурации MetaDapper без изменения кода или перекомпиляции.
Компании, поставляющей программное обеспечение для управления активами, требовалось решение для создания финансовых данных в форматах пакетов бухгалтерского учета, зависящих от клиента, для импорта в эти системы. Общий запрос бухгалтерских данных был разработан с использованием оболочки ORM, а MetaDapper использовался для сортировки, фильтрации и преобразования данных в желаемую схему и формат для каждого клиента. Для каждого клиента создается одна или несколько конфигураций MetaDapper, и это стало основной функцией продаж для новых клиентов. Продукт можно настроить (с помощью MetaDapper) за считанные минуты для поддержки любого пользовательского или стандартного формата пакета бухгалтерского учета, поэтому интеграция с основными и существующими системами включается в каждую новую продажу. Эта же компания использует MetaDapper в различных проектах интеграции программного обеспечения, отображая и конвертируя данные и конвертируя внутренние коды между своими системами.
Крупному торговому посреднику по продаже автомобилей нужно было добавить несколько отчетов о продажах в формате Excel в одно из своих приложений. Отчеты были добавлены в приложение менее чем за час — от начала до конца.
Разработчику нужна была таблица штатов США, идентичная набору, используемому на другом сайте. MetaDapper использовался для извлечения данных с сайта и создания SQL-скрипта для заполнения его таблицы за несколько минут.
Это всего лишь несколько примеров проверенной полезности и ценности MetaDapper как инструмента отображения данных.
Заворачивать
Требуется умственный скачок, чтобы начать думать о преобразовании данных в более общем плане и начать думать о наборах данных с бизнес-правилами и неограниченной полезностью. MetaDapper — это фреймворк, который поддерживает и облегчает эту точку зрения.
Независимо от того, используете ли вы MetaDapper, другую технологию или внедряете свои собственные решения для отображения данных, это было знакомство с некоторыми сложностями и скрытыми затратами в проектах преобразования данных. Я надеюсь, что вы найдете его информативным.
(Для получения дополнительной информации о MetaDapper свяжитесь с командой MetaDapper по адресу [email protected].)