2009-04-30 96 views
0

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

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 

有一个总的1963年不同行56节,所以我真的不进 创建56个教学班,1963年的属性...你会如何处理这个文件 这样你可以访问一些属性,就像它是一个对象?

Datrkaib.Kaib_Status_Fm 
Datrkarp.karp_St_Meld 

回答

1

除非您的编程语言允许您在运行时向类添加方法,或让类对未定义方法的调用作出响应,否则您无法执行此操作。问题是,即使C#确实让你这样做了,你仍然会失去类型安全和智能感知帮助(大概是想让它像这样工作的原因之一),那么为什么不直接将它读入一些数据结构呢?我倾向于是可包含值或其他哈希散列,所以你会得到这样的方法调用(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") 

您可以通过创建所有的数据项名称的枚举和获取找回智能感知帮助:

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

我会去与不同对象的列表<name, list>,这可以是一个元组<name, value>或对象的命名列表。

1

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

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

+0

我的倾向是完全相反的。数据已经结构良好。为什么要进行转换? – 2009-04-30 10:36:16

+1

因为搜索和替换比编写该格式的解析器简单得多,因为在.NET中,您可以免费获得XML读取,转换和序列化。 – OregonGhost 2009-04-30 10:49:50

0

没有那会自动为你做这个。我会创建一个包含所有适当属性(比如DatrDocument)的类,并创建一个DatrReader类(类似于XmlDocument/XmlReader类的想法)。

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

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