Блок синтаксического анализа C # - PullRequest
5 голосов
/ 17 января 2011

Одна из функций в API, который я использую, возвращает в основном только большой блок текста, разделяя каждый ключ / значение точкой с запятой. Как бы я разобрать текст в C #?

Результат = успех; 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;

Ответы [ 4 ]

13 голосов
/ 17 января 2011

Ну, это похоже на случай:

  • Вызов text.Split(';'), чтобы разделить блок на пары ключ-значение
  • Вызов pair.Split('=') для каждой пары, чтобы разделить егов ключ и значение

Обратите внимание, что string.Split имеет различные перегрузки, которые вы можете посмотреть, какие параметры могут быть указаны для количества возвращаемых строк, для исключения пустых значений и т. д.

1 голос
/ 18 января 2011

А вот одна строка (для ясности отформатированная в несколько строк).

Dictionary<string, string> dictionary = raw
    .Split(new [] { ';', }, StringSplitOptions.RemoveEmptyEntries)
    .Select(x => x.Split('='))
    .ToDictionary(x => x[0], x => x[1]);
1 голос
/ 17 января 2011

У меня недавно была похожая проблема.Вот фрагмент кода, который может быть полезен для вас.Стратегия такая же, как в Ответы Джона Скита .

Похоже, что ключи уникальны в вашем блоке текста, поэтому вы можете использовать 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 голосов
/ 17 января 2011

Я бы использовал String.Split (Char []) . Адаптируя пример, который вам понадобится string [] split = words.Split(new Char [] {';'});

...