2011-01-17 13 views
5

Una de las funciones en la API que estoy usando es básicamente devolver un bloque de texto grande, separando cada clave/valor por un punto y coma. ¿Cómo analizaría un texto como este en C#?C# Analizando el bloque de texto

resultado = éxito; 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;

Respuesta

13

Bueno, que se parece a un caso de:

  • llamada text.Split(';') para dividir el bloque en pares de valores clave
  • llamada pair.Split('=') en cada par para dividirlo en clave y el valor

Tenga en cuenta que string.Split tiene varias sobrecargas que puede consultar para ver opciones sobre la cantidad de cadenas a devolver, ya sea para suprimir valores vacíos, etc.

+0

¡Muchas gracias! –

+0

Déjame darte tu insignia de bronce de 1896;) – Arcturus

+0

jaja gracias: P Además, ¿esto es verdad? http://www.ampaste.net/d5fb70b78 Cuando hago listBox1.Items.Add (stat); imprime bien la clave/valor, pero cuando hago listBox1.Items.Add (values); agrega una tonelada de "String [] Array" a la lista. –

0

Yo usaría String.Split(Char[]). Adaptando el ejemplo que necesitaría string [] split = words.Split(new Char [] {';'});

+0

Ten en cuenta que no necesitas escribir explícitamente la "nueva charla" [] {} "parte ya que el parámetro es una matriz de parámetros (params). –

+0

Ah, lo veo si la matriz es solo un elemento string [] split = words.Split (';'); ¿Será suficiente? –

1

Tuve un problema similar recientemente. Aquí hay un fragmento de código que puede ser útil para usted. La estrategia es la misma que en Jon Skeet's anwers.

Parece que las claves son únicas en su bloque de texto, por lo tanto, es posible utilizar 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

Eso funcionó muy bien, gracias! –

1

Y aquí es la de una sola línea (con formato a través de múltiples líneas para mayor claridad).

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