如何将异构平面数据转换为数据结构

时间:2015-09-23 14:12:31

标签: algorithm design-patterns transformation

我正在寻找一种将平面数据转换为数据结构的方法。此转换的输入不是同质的。某些数据包含太多信息,其他数据包含需要处理的信息。

让我举个例子来解释一下。假设我有一些带有汽车数据的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    

如您所见,文件略有不同:第一列的名称和品牌,电源的不同测量单位,制造商位于不同的位置,文件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);
}

我的问题是:我怎样才能做到这一点,但更重要的是:我该如何研究这个?

更新

我最终选择了一种方法,其中目标结构是硬编码的(即CarEngine类)。用户得到了一个工具,根据文件类型,他将列映射到这些类的属性。然后,翻译器将列中的值转换为类中的属性。

3 个答案:

答案 0 :(得分:3)

我或多或少地这样做:

  1. 为每种文件类型创建数据模型。将文件反序列化写入这些数据模型。
  2. 对于每个模型,创建一个转换为您的通用模型。例如,这可以在每个内部完成(例如,使它们实现接口)。
  3. 根据文件类型,实例化相应的模型并从文件加载,然后使用转换实用程序。
  4. 您的转换规则&#34;想法是在设计的那一部分之外的东西,因为它是转换函数的细节&#39;的实施方式。

答案 1 :(得分:1)

你做得对。对于每个文件,您需要定义它如何转换为您的对象。如果每个文件彼此独立,则可以按任何顺序转换它们。如果缺少字段,则需要定义它们应该获得的值。

如果您想直接从java进行操作,请查看 apache-POI 库,或将其导出为CSV进行处理。

更广泛的方法是将其转换为XML,以便任何工具都知道如何使用某些XSL转换来处理它。

答案 2 :(得分:0)

我建议使用XML,XSL&amp; JAXB通过以下方式实现此目的 -

  1. 将平面文件读入XML,其属性为和 属性的值作为标记的值,即值 。例如欧宝。您可以使用 带有令牌的StringTokenizer&#39; |&#39;为此
  2. 现在使用XPATH和XSLT从源XML结构映射到目标XML结构
  3. 使用目标格式的XML后,使用JAXB将XML的值加载到其等效的对象内容树中(注意 要使用JAXB,您需要生成组成的类 事先要为其定义XML的内容树 首先是目标XML结构的模式(XSD)