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

How to transform heterogenous flat data to data structure

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

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

我认为转换也需要 classes 作为转换规则:

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 class)。用户获得了一个工具,在该工具中,他可以根据文件类型将列映射到那些 classes 的属性。然后,转换器将列中的值转换为 classes.

中的属性

我或多或少就是这样做的:

  1. 为每种文件类型创建数据模型。将文件的反序列​​化写入这些数据模型。
  2. 对于这些模型中的每一个,创建到您的通用模型的转换。例如,这可以在每个内部完成(例如,让它们实现一个接口)。
  3. 根据文件类型,实例化适当的模型并从文件中加载,然后使用转换实用程序。

您的 "transformation rules" 想法超出了设计的那一部分,例如,它是转换函数实现的细节。

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

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

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

我建议通过以下方式为此使用 XML、XSL 和 JAXB -

  1. 将平面文件读入 XML 属性为 and 属性的值作为标签的值,即值 .例如欧宝。您可以使用 StringTokenizer,标记为“|”为此
  2. 现在使用 XPATH 和 XSLT 将源 XML 结构映射到目标 XML 结构
  3. 一旦目标格式中有 XMLs,然后使用 JAXB 将 XML 的值加载到它们的等效对象内容树中(注意 要使用 JAXB,您需要生成 类 组成 您需要预先定义的内容树 XML 架构(XSD)首先为您的目标 XML 结构)