【问题标题】:Import textfile with weird format in C#在 C# 中导入格式怪异的文本文件
【发布时间】:2009-04-30 10:07:38
【问题描述】:

我有一些奇怪的(这个行业的标准!)格式的导出文件,我需要将其导入 我们的数据库。该文件基本上是这样的:

DATRKAKT-START
  KAKT_LKZ  "D"
  KAKT_DAT_STAMM    "1042665"

  DATRKAIB-START
    KAIB_AZ "18831025"
    KAIB_STATUS_FM  2
    KAIB_KZ_WAE "E"
  DATRKAIB-END

  DATRKARP-START
    KARP_MELD   "831025"
    KARP_ST_MELD    "G"
  DATRKARP-END

...
DATRKAKT-END

共有 56 个部分,共有 1963 个不同的行,所以我真的不喜欢 创建具有 1963 个属性的 56 个类...您将如何处理此文件 这样您就可以像访问对象一样访问某些属性?

Datrkaib.Kaib_Status_Fm
Datrkarp.karp_St_Meld

【问题讨论】:

    标签: c# .net import


    【解决方案1】:

    除非您的编程语言允许您在运行时向类添加方法或让类响应对未定义方法的调用,否则您无法做到这一点。问题是,即使 C# 允许你这样做,你也会失去类型安全和 Intellisense 帮助(大概是希望它像那样工作的原因之一),那么为什么不直接把它读入一些数据结构呢?我的倾向是可以包含值或其他散列的散列,因此您会收到类似 (VB) 的调用:

    Datrkakt("Lkz")
    Datrkakt("Dat_Stam")
    Datrkakt("Kaib")("Az")
    Datrkakt("Kaib")("Status_Fm")
    

    或者,如果您知道所有数据项在您的示例中都是唯一命名的,则只需使用一个哈希:

    Datr("Kakt_Lkz")
    Datr("Kakt_Dat_Stam")
    Datr("Kaib_Az")
    Datr("Kaib_Status_Fm")
    

    您可以通过创建所有数据项名称的枚举并获取以下信息来获取 Intellisense 帮助:

    Datr(DatrItem.KAKT_LKZ)
    Datr(DatrIrem.KAIB_STATUS_FM)
    

    【讨论】:

    • 我忘了提到每个部分可以存在 x 次。所以即使 Datrkakt("Kaib")("Status_Fm") 也会给我带来困难。不过,我现在所做的与您的方法相似。如果没有人想出更简单的方法,我可能会接受它作为答案。
    【解决方案2】:

    它看起来像结构化数据 - 我会运行搜索和替换并将其转换为简单的 xml。然后导入。

    如果你想从中生成一个代码文件——考虑codesmith——我认为它可以做到这一点。

    【讨论】:

    • 我的倾向正好相反。数据已经结构良好。为什么要为转换烦恼?
    • 因为搜索和替换比为该格式编写解析器要简单得多,因为在 .NET 中您可以免费获得 XML 读取、转换和序列化。
    • 我真的不知道他们为什么不将这种导出作为 xml 提供......就这么简单。在导入之前将其重新解析为 xml 确实是我的第一个想法,但不知何故我设法忘记了它。我有没有提到我有多讨厌这种格式的规范?...
    【解决方案3】:

    我会使用各种对象的列表 <name, list>,它可以是元组 <name, value> 或对象的命名列表。

    【讨论】:

      【解决方案4】:

      不会自动为您执行此操作。

      我将创建一个包含所有适当属性的类(比如 DatrDocument),并创建一个 DatrReader 类(类似于 XmlDocument/XmlReader 类的想法)。

      DatrReader 需要读取文件或流的内容,并将其解析为 DatrDocument。

      您可能还想编写一个 DatrWriter 类,该类将采用 DatrDocument 并将其写入流。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 2022-10-10
        • 2021-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多