Frage

Ich möchte eine durch Trennzeichen getrennte Zeichenfolge analysieren, etwa in der Größenordnung von

ABC

Dies ist jedoch ein sehr einfaches Beispiel, und das Parsen von durch Trennzeichen getrennten Daten kann komplex werden.zum Beispiel

1, „Ihr einfacher Algorithmus schlägt fehl“, stimmt

würde Ihre naive string.Split-Implementierung in Stücke sprengen.Gibt es etwas, das ich frei verwenden/stehlen/kopieren und einfügen kann und das eine relativ sichere Lösung für das Parsen von durch Trennzeichen getrenntem Text bietet?.NET, plox.

Aktualisieren: Ich habe mich für das entschieden TextFieldParser, das Teil der vielen Extras von VB.NET ist, die in Microsoft.VisualBasic.DLL versteckt sind.

War es hilfreich?

Lösung

Ich verwende dies, um aus einer Datei zu lesen

string filename = @textBox1.Text;
string[] fields;
string[] delimiter = new string[] {"|"};
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
       new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) {
    parser.Delimiters = delimiter;
    parser.HasFieldsEnclosedInQuotes = false;

    while (!parser.EndOfData) {
        fields = parser.ReadFields();
        //Do what you need
    }
}

Ich bin sicher, dass jemand hier dies umwandeln kann, um eine Zeichenfolge zu analysieren, die sich im Speicher befindet.

Andere Tipps

Eine sehr umfangreiche Bibliothek finden Sie hier: FileHelpers

Mir ist kein Framework bekannt, aber eine einfache Zustandsmaschine funktioniert:

  • Zustand 1:Lesen Sie jedes Zeichen, bis Sie ein „ oder ein ,
    • Im Falle eines „:Wechseln Sie zu Status 2
    • Im Falle eines:Wechseln Sie zu Zustand 3
    • Im Falle des Endes der Datei:Gehen Sie zu Zustand 4
  • Zustand 2:Lesen Sie jedes Zeichen, bis Sie ein „
    • Im Falle eines „:Wechseln Sie zu Status 1
    • Im Falle des Endes der Datei:Wechseln Sie entweder zu Status 4 oder melden Sie einen Fehler aufgrund einer nicht abgeschlossenen Zeichenfolge
  • Zustand 3:Fügen Sie den aktuellen Puffer zum Ausgabearray hinzu, bewegen Sie den Cursor nach vorne hinter das und zurück zu Status 1.
  • Zustand 4:Dies ist der Endzustand, der nichts außer der Rückgabe des Ausgabearrays bewirkt.

Wie zum Beispiel

var elements = new List<string>();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}

Hier gibt es einige gute Antworten: Teilen Sie eine Zeichenfolge und ignorieren Sie Abschnitte in Anführungszeichen

Vielleicht möchten Sie Ihre Frage genauer formulieren (z. B. Welches Code-Snippet oder welche Bibliothek kann ich zum Parsen von CSV-Daten in .NET verwenden??).

Um einen schamlosen Plug zu machen, arbeite ich schon seit einiger Zeit an einer Bibliothek mit dem Namen fotelo (Formatted Text Loader), den ich verwende, um große Textmengen basierend auf Trennzeichen, Position oder Regex schnell zu analysieren.Für eine schnelle Zeichenfolge ist es übertrieben, aber wenn Sie mit Protokollen oder großen Mengen arbeiten, ist es möglicherweise genau das, was Sie brauchen.Es basiert auf einem Steuerdateimodell, das SQL*Loader ähnelt (sozusagen die Inspiration dahinter).

Besser spät als nie (zur Vollständigkeit von SO hinzufügen):

http://www.codeproject.com/KB/database/CsvReader.aspx

Diese verdammten Regeln.

GJ

Ich denke, dass ein generisches Framework zwei Dinge spezifizieren müsste:1.Was sind die Trennzeichen?2.Unter welchen Bedingungen zählen diese Zeichen nicht (z. B. wenn sie zwischen Anführungszeichen stehen).

Ich denke, es ist möglicherweise besser, für jedes Mal, wenn Sie so etwas tun müssen, eine benutzerdefinierte Logik zu schreiben.

Der einfachste Weg besteht darin, die Zeichenfolge einfach in ein char-Array aufzuteilen und nach Ihren Zeichenfolgenbestimmungselementen und dem geteilten Zeichen zu suchen.

Es sollte relativ einfach sein, Unit-Tests durchzuführen.

Sie können es in eine Erweiterungsmethode einschließen, die der grundlegenden .Spalt-Methode ähnelt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top