【问题标题】:How to transform heterogenous flat data to data structure如何将异构平面数据转换为数据结构
【发布时间】:2015-09-23 14:12:31
【问题描述】:

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

让我用一个例子来解释。假设我有一些带有汽车数据的 Excel 文件。这些文件包含有关汽车及其引擎的信息。

文件 1:

姓名 |类型 |引擎ID |制造商 |功率(马力) |扭矩 欧宝 |亚当 | I4 |欧宝 | 69 | 115

文件 2:

品牌 |类型 |引擎 |功率 (kW) |制造商 菲亚特 |蓬托 | 1.2-L | 44 |克莱斯勒

如您所见,文件略有不同:第一列的名称和品牌,功率的不同计量单位,制造商的位置不同,文件 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 类)。用户得到了一个工具,他可以根据文件类型将列映射到这些类的属性。然后翻译器将列中的值翻译为类中的属性。

【问题讨论】:

标签: algorithm design-patterns transformation


【解决方案1】:

这就是我的做法,或多或少:

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

您的“转换规则”想法超出了设计的那一部分,例如,它是转换函数实现的细节。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的意见。它有助于找到合适的解决方案。
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的意见。不过,我的解决方案必须比您的方法更灵活。
    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多