2009-04-30 3 views
0

Ich habe diese exportierte Datei von einigen seltsamen (Standard für diese Industrie!) Format, die ich in unserer Datenbank importieren muss. Die Datei sieht im Grunde wie folgt:Import Textdatei mit seltsamen Format in 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 

Es gibt 56 Abschnitte mit insgesamt 1963 verschiedenen Reihen, also bin ich wirklich nicht in Erstellen 56 Klassen mit 1963 Eigenschaften ... Wie würden Sie diese Datei handhaben damit Sie auf eine Eigenschaft wie auf ein Objekt zugreifen können?

Datrkaib.Kaib_Status_Fm 
Datrkarp.karp_St_Meld 

Antwort

1

Sofern Ihre Programmiersprache nicht die Möglichkeit bietet, Methoden zur Laufzeit zur Klasse hinzuzufügen oder Klassen auf Aufrufe von undefinierten Methoden reagieren zu lassen, gibt es keine Möglichkeit, dies zu tun. Die Sache ist, selbst wenn C# Sie hätte das tun lassen, würden Sie Typsicherheit und Intellisense-Hilfe sowieso verlieren (vermutlich unter den Gründen dafür, dass es so funktioniert), also warum nicht einfach weitermachen und es in eine Datenstruktur einlesen? Meine Neigung wäre ein Hash sein, die Werte oder andere Hashes enthalten kann, so werden Sie Anrufe wie (VB) erhalten:

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

Oder wenn Sie alle Datenelemente wissen eindeutig, wie in Ihrem Beispiel genannt werden, nur verwenden ein hash:

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

Sie können den Datenelementnamen durch die Schaffung eines enum aller Intellisense Hilfe zurück und bekommen:

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

Ich habe vergessen zu erwähnen, dass jeder Abschnitt existiert x mal .. So sogar Datrkakt ("Kaib") ("Status_Fm") würde mir eine harte geben Zeit. Dennoch, was ich gerade mache, ist Ihrem Ansatz ähnlich. Ich werde es wahrscheinlich als die Antwort akzeptieren, wenn niemand mit einem einfacheren Ansatz kommt. –

0

ich mit einer Liste <name, list> von verschiedenem Objekt gehen würde, kann man erkennen, ein Tupel <name, value> oder eine benannte Liste von Objekt sein.

1

Es sieht aus wie strukturierte Daten - ich würde suchen und ersetzen und es in eine einfache XML konvertieren. und dann importieren.

Wenn Sie eine Code-Datei davon erstellen möchten - in Betracht ziehen codesmith - Ich denke, dass es das tun kann.

+0

Meine Neigung genau das Gegenteil ist. Die Daten sind bereits gut strukturiert. Warum mit einer Konvertierung belästigen? –

+1

Da Suchen und Ersetzen ist viel einfacher als das Schreiben eines Parser für dieses Format, weil in .NET erhalten Sie XML-Lesen, Transformationen und Serialisierung kostenlos. – OregonGhost

+1

Ich weiß wirklich nicht, warum sie diesen Export nicht als xml bereitstellen ... wäre so einfach. Es war meine erste Idee, es vor dem Import in XML zu konvertieren, aber irgendwie konnte ich es vergessen. Habe ich erwähnt, wie sehr ich die Spezifikation für dieses Format hasse? ... –

0

Es gibt nicht, dass dies automatisch für Sie tun wird.

Ich würde eine Klasse erstellen, die alle geeigneten Eigenschaften enthält (sagen wir DatrDocument), und eine DatrReader-Klasse erstellen (ähnliche Idee wie die XmlDocument/XmlReader-Klassen).

Der DatrReader muss den Inhalt der Datei oder des Streams lesen und in ein DatrDocument parsen.

Sie können auch eine DatrWriter-Klasse schreiben, die ein DatrDocument nimmt und in einen Stream schreibt.