2015-09-23 2 views
2

Я ищу способ преобразования плоских данных в структуру данных. Вход для этого преобразования не является однородным. Некоторые данные содержат слишком много информации, другие данные содержат информацию, которая нуждается в обработке.Как преобразовать гетерогенные плоские данные в структуру данных

Позвольте мне пояснить на примере. Предположим, у меня есть файлы Excel с данными о машине. Файлы содержат информацию об автомобилях и их двигателях.

Файл 1:

 
Name | Type | EngineId | Manufacturer | Power (hp) | Torque 
Opel | Adam | I4  | Opel   | 69   | 115 

Файл 2:

 
Brand | Type | Engine | Power (kW) | Manufacturer 
Fiat | Punto | 1.2-L | 44   | Chrysler  

Как вы можете видеть, файлы немного отличаются: Имя и марка для первого столбца, разные единицы измерения для Power, Производитель находится в разных положениях, и в файле 2 отсутствует момент крутящего момента.

Я хотел бы превратить это что-то вроде:

public class Car { 
    string Name; 
    string Type; 
    Engine Engine; 
} 

public class Engine { 
    string Id; 
    string Manufacturer; 
    double Power; 
    Dictionary<string,string> OtherAttributes; 
} 

Я думаю, трансформируют потребности классов для правил преобразования, а также:

public class MappingRules { 
    string FileType; // File 1 vs File 2 
    List<MappingRule> MappingRules; 
} 

public class MappingRule<T> { 
    string SourceColumnName; 
    string Target; 
    ITranslate<T> Translator; 
} 

interface ITranslate<T> { 
    T Convert(T sourceValue); 
} 

Моей проблемы: как я могу добиться этого, но даже подробнее: как мне это исследовать?

Обновление

я, наконец, выбрал подход, в котором закодирована структура-мишень (то есть Car и Engine класс). Пользователь получил инструмент, в котором он, по типу файла, сопоставляет столбцы свойствам этих классов. Затем переводчик преобразует значения в столбцы в свойства классов.

+1

Это будет по крайней мере, начните изучение темы: https://en.wikipedia.org/wiki/Data_cleansing, но я надеюсь, что это не все, что полезно для этой проблемы. – MushinNoShin

ответ

1

Вы делаете это правильно. Для каждого файла вам нужно определить, как он преобразуется в ваш объект. Если каждый файл не зависит друг от друга, они могут быть преобразованы в любом порядке. Если отсутствуют поля, вам нужно определить, какую ценность они должны получить.

Если вы хотите сделать это прямо из java, ознакомьтесь с библиотекой apache-POI или экспортируйте ее в CSV для обработки.

Более обширный способ преобразования его в XML, чтобы любой инструмент знал, как обрабатывать его, используя некоторые преобразования XSL.

+0

Спасибо за ввод. Это помогло найти подходящее решение. – venerik

3

Вот как я это сделать, более или менее:

  1. Создание моделей данных для каждого из типов файлов. Напишите десериализацию файлов в эти модели данных.
  2. Для каждой из этих моделей создайте преобразование в общую модель. Это можно сделать, например, либо внутри каждого из них (например, для реализации интерфейса).
  3. Основываясь на типе файла, создайте соответствующую модель и загрузите ее из файла, а затем используйте утилиту преобразования.

Идея «правил трансформации» - это нечто, лежащее вне этой части дизайна, как и в, это детали реализации функций преобразования.

0

Я бы рекомендовал использовать XML, XSL & JAXB для этого следующим образом -

  1. Прочитайте плоские файлы в формате XML с атрибутом, как и значение атрибута в качестве значения тега, т.е. значение , Например, Opel. Вы можете использовать StringTokenizer с токеном как '|' для этого
  2. Теперь используйте XPATH и XSLT для сопоставления из исходной структуры XML в целевую структуру XML
  3. После того, как вы используете XML в целевом формате, используйте JAXB для загрузки значений XML в их эквивалентное Дерево содержания объектов (Примечание для использования JAXB вам нужно будет генерировать классы, которые составляют дерево контента заранее, для которого необходимо определить XML Schemas (XSD) для целевых структур XML первый)
+0

Спасибо за ввод. Однако мое решение должно обладать большей гибкостью, чем ваш подход. – venerik

Смежные вопросы