10 Stimmen

Beste Methode für Textfile Parsing in C#?

Ich möchte eine Konfigurationsdatei analysieren, wie zum Beispiel so:

[KEY:Value]     
    [SUBKEY:SubValue]

Jetzt habe ich mit einer StreamReader Zeilen in Zeichenarrays umzuwandeln, als mir klar wurde, dass es einen besseren Weg geben muss. Also bitte ich Sie, bescheidener Leser, mir zu helfen.

Eine Einschränkung ist, dass es in einer Linux/Mono-Umgebung funktionieren muss (1.2.6 um genau zu sein). Ich habe nicht die neueste Version 2.0 (von Mono), also versuchen Sie, Sprachfunktionen auf C# 2.0 oder C# 1.0 zu beschränken.

13voto

Orion Edwards Punkte 117361

Ich habe es in Betracht gezogen, aber ich werde XML nicht verwenden. Ich werde dieses Zeug von Hand schreiben, und die manuelle Bearbeitung von XML bereitet mir Kopfschmerzen :')

Haben Sie sich angesehen YAML ?

Sie erhalten die Vorteile von XML ohne all die Schmerzen und Leiden. Es ist ausgiebig in der Ruby-Community für Dinge wie Konfigurationsdateien, vorbereitete Datenbankdaten, etc. verwendet

Hier ein Beispiel

customer:
  name: Orion
  age: 26
  addresses:
    - type: Work
      number: 12
      street: Bob Street
    - type: Home
      number: 15
      street: Secret Road

Es scheint eine C#-Bibliothek hier die ich persönlich noch nicht benutzt habe, aber yaml ist ziemlich einfach, also "wie schwer kann es schon sein?" :-)

Ich würde sagen, das ist besser, als ein eigenes Ad-hoc-Format zu erfinden (und sich mit Parser-Fehlern herumzuschlagen).

4voto

eplawless Punkte 4125

Ich habe mich neulich fast genau mit diesem Problem beschäftigt: dieser Artikel zur Tokenisierung von Zeichenketten ist genau das, was Sie brauchen. Sie wollen Ihre Token als etwas wie definieren:

@"(?&ltlevel>\s) | " +
@"(?&ltterm>[^:\s]) | " +
@"(?&ltseparator>:)"

In dem Artikel wird das ziemlich gut erklärt. Von dort aus können Sie einfach anfangen, Token zu essen, wie Sie es für richtig halten.

Protip: Für ein LL(1)-Parser (lies: einfach), können Token kein Präfix teilen. Wenn Sie abc als Token, können Sie nicht haben ace als Wertmarke

Hinweis: Im Artikel fehlen die | Zeichen in den Beispielen, fügen Sie sie einfach ein.

1voto

ICR Punkte 13528

Eine Bibliothek zu benutzen ist fast immer besser, als selbst zu rollen. Hier ist eine kurze Liste von "Oh, das werde ich nie brauchen, daran habe ich nicht gedacht"-Punkten, die am Ende kommen, um Sie später zu beißen in der Zeile:

  • Flüchtende Zeichen. Was, wenn Sie ein : im Schlüssel oder ] im Wert haben wollen?
  • Flucht vor dem Escape-Zeichen.
  • Unicode
  • Mischung aus Tabulatoren und Leerzeichen (siehe die Probleme mit der auf Leerzeichen reagierenden Syntax von Python)
  • Behandlung unterschiedlicher Rückgabezeichenformate
  • Handhabung von Syntaxfehlerberichten

Wie bereits von anderen vorgeschlagen, scheint YAML die beste Lösung zu sein.

1voto

Antoine Aubry Punkte 11873

Es gibt eine weitere YAML-Bibliothek für .NET das sich in der Entwicklung befindet. Im Moment unterstützt es das Lesen von YAML-Streams und wurde unter Windows und Mono getestet. Schreibunterstützung wird derzeit implementiert.

0voto

Ed S. Punkte 118985

Es sieht für mich so aus, dass Sie besser dran wären, wenn Sie eine XML-basierte Konfigurationsdatei verwenden würden, da es bereits .NET-Klassen gibt, die die Informationen relativ einfach lesen und speichern können. Gibt es einen Grund, dass dies nicht möglich ist?

@Bernard: Es stimmt zwar, dass die manuelle Bearbeitung von XML mühsam ist, aber die Struktur, die Sie präsentieren, sieht XML bereits sehr ähnlich.

Dann ja, hat da eine gute Methode.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X