2011-01-17 12 views
5

Eine der Funktionen in der API, die ich verwende, ist im Grunde nur ein großer Textblock, der jede Taste/Wert durch ein Semikolon trennt. Wie würde ich einen solchen Text in C# analysieren?C# Parsing Block von Text

result = Erfolg; income_today =; income_thismonth =; income_thisyear =; orders_pending = 19; orders_today_cancelled = 0; orders_today_pending = 0; orders_today_fraud = 0; orders_today_active = 0; orders_today_total = 0; orders_yesterday_cancelled = 0; orders_yesterday_pending = 3 ; orders_yesterday_fraud = 2; orders_yesterday_active = 0;

Antwort

13

Nun, das aussieht wie ein Fall von:

  • Anruf text.Split(';') den Block in Schlüssel-Wert-Paare
  • Anruf pair.Split('=') auf jedem Paar zu teilen ihn in Schlüssel und Wert
aufzuspalten

Beachten Sie, dass string.Split verschiedene Überladungen aufweist, die Sie möglicherweise nach Optionen in Bezug auf die Anzahl der zurückzugebenden Zeichenfolgen durchsuchen möchten, um leere Werte usw. zu unterdrücken.

+0

Vielen Dank! –

+0

Lassen Sie mich Ihnen Ihre Bronzemarke aus dem Jahr 1896 geben;) – Arcturus

+0

haha ​​danke: P Auch, ist das ungefähr richtig? http://www.ampaste.net/d5fb70b78 Wenn ich listBox1.Items.Add (stat); es druckt die Schlüssel/Wert-Fein, aber wenn ich listBox1.Items.Add (Werte); es fügt eine Tonne "String [] Array" zur Listbox hinzu. –

0

Ich würde String.Split(Char[]) verwenden. Anpassung des Beispiels, das Sie benötigen string [] split = words.Split(new Char [] {';'});

+0

Beachten Sie, dass Sie nicht explizit das "neue Zeichen [] {} "Teil als Parameter ist ein Parameter-Array (params). –

+0

Ah sehe ich so, wenn das Array nur ein Element ist string [] split = words.Split (';'); wird genügen? –

1

Ich hatte vor kurzem ähnliche Problem. Hier ist ein Code, der für Sie nützlich sein könnte. Die Strategie ist die gleiche wie in Jon Skeet's anwers.

Es sieht aus wie die Schlüssel in Ihrem Textblock eindeutig sind, daher können Sie Dictionary

string[] pairs = block.Split(';'); 
Dictionary<string, string> values = new Dictionary<string, string>(); 

foreach (var element in pairs) 
{ 
    var tmp = element.Split('='); 
    var key = tmp[0]; 
    var val = tmp.Length == 2 ? tmp[1] : string.Empty; 
    values.Add(key,val); 
} 

foreach (var el in values) 
{ 
    Console.WriteLine(el); 
} 
+0

Das hat wunderbar funktioniert, danke! –

1

verwenden Und hier ist die Einzeiler (formatiert über mehrere Zeilen für Klarheit).

Dictionary<string, string> dictionary = raw 
    .Split(new [] { ';', }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(x => x.Split('=')) 
    .ToDictionary(x => x[0], x => x[1]);