2008-08-13 14 views
3

Ich suche eine begrenzte Zeichenfolge, etwas in der Größenordnung vonGetrennte String-Parsing?

a, b, c

Aber dies ist ein sehr einfaches Beispiel, und getrennte Daten-Parsing kann komplexe bei Parsen erhalten; zum Beispiel

1: "Ihr einfacher Algorithmus, scheitert es", True

würde Ihre naiive String.split Implementierung Bits blasen. Gibt es etwas, das ich frei verwenden/stehlen/kopieren und einfügen kann, bietet eine relativ kugelsichere Lösung zum Parsen von begrenztem Text? .NET, plox.

Update: entschied ich mich, mit dem TextFieldParser zu gehen, die in Microsoft.VisualBasic.dll Teil von VB.NET ist Haufen Goodies versteckt ist.

Antwort

4

Ich benutze diese aus einer Datei diese

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 zu lesen verwandeln kann ein String-Parser, der im Speicher befindet.

+0

Zurück zu dieser Antwort, ich denke immer noch, es ist das Beste. Ich habe die FileHelpers ausprobiert und bin zu dem Schluss gekommen, dass sie mich erschrecken. Ich vertraue keinem Framework, das auf der Reihenfolge basiert, in der Felder für einen Typ definiert sind. – Will

0

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

Ich denke, es könnte besser sein, benutzerdefinierte Logik für jedes Mal zu schreiben, wenn Sie so etwas tun müssen.

2

Ich bin nicht bekannt, dass Rahmen, sondern eine einfache Zustandsmaschine funktioniert:

  • Zustand 1: jedes Zeichen lesen, bis Sie ein „oder ein,
    • Im Falle eines“ Treffers: bewegen Sie den Zustand 2
    • Bei a,: verschieben in dem Zustand 3
    • Bei Ende der Datei: verschieben in dem Zustand 4
  • Zustand 2: jedes Zeichen lesen, bis Sie einen Hit „
    • Im Fall eines“: Move zu State 1
    • Bei dem Ende der Datei: Entweder verschieben Zustand 4 oder ein Fehlersignal wegen eine abgebrochene Zeichenfolge
  • Zustand 3: der aktuellen Puffer zu dem Ausgangsarray hinzufügen, um die Cursor nach vorne hinter der Bewegung, und zurück zum Zustand 1.
  • Zustand 4: Dies ist der Endzustand, tut nichts außer der Rückkehr das Ausgangsarray.
+0

CSV-Strings können neue Zeilen Zeichen in Text zitiert sind, so können Sie kein Fehlersignal, während im Zustand 2, wenn Ende der Leitung. – cjk

+0

Das stimmt, ich vergesse immer den gefürchteten \ n Charakter, der die meisten CSV Parser vermasselt. Abgeklärt. –

1

Es gibt einige gute Antworten hier: Split a string ignoring quoted sections

Sie möchten Ihre Frage etwas genauer (? ZB Welche Code-Schnipsel oder Bibliothek kann ich CSV-Daten in .NET zu analysieren verwenden) neu zu formulieren .

2

Wie

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; 
} 
+1

@ C1pher bitte machen Sie keine stilistischen Änderungen, wie Java vs C#/Pascal Bracketing. – StuartLC

+0

Einverstanden. Ich habe versucht, diese Änderung abzulehnen, aber sie wurde bereits genehmigt. –

+0

Wobei ich hinzufügen möchte, dass wir weder K & R, noch Linux Kernel-Entwicklung sind. FFS, Leute. – Stu

0

einfachste Weg ist, nur die Zeichenfolge in einen char-Array zu spalten und für die Zeichenfolge Determinatoren und Split-Zeichen aussehen.

Es sollte relativ einfach zu Komponententest sein.

Sie können es in eine Erweiterungsmethode ähnlich der grundlegenden .Spilt-Methode einbinden.

+0

Eine Zeichenfolge ist inhärent ein Char-Array, Sie müssen keine Konvertierung durchführen – cjk

1

Um einen schamlosen Stecker zu machen, arbeite ich seit einer Weile an einer Bibliothek mit dem Namen fotelo (Formatierter Textlader), mit der ich große Mengen Text basierend auf Begrenzer, Position oder Regex schnell parsen kann. Für eine schnelle Zeichenfolge ist es Overkill, aber wenn Sie mit Logs oder großen Mengen arbeiten, kann es genau das sein, was Sie brauchen. Es arbeitet mit einem Kontrolldateimodell ähnlich dem SQL * Loader (Art der Inspiration dahinter).

2

Eine sehr complrehesive Bibliothek finden Sie hier: FileHelpers

+0

Ich habe die FileHelpers seit dem Stellen dieser Frage versucht, und ich mag die begrenzten Parser wirklich nicht. – Will