Получить поля данных из разделенных пробелами и заключенных в кавычки элементов в строке - PullRequest
0 голосов
/ 24 сентября 2018

Чтобы обработать ответ API, мне нужно сначала разбить строку на отдельные строковые поля.Количество полей фиксировано (каждое всегда присутствует), но «пустое» поле может быть представлено как ? или "".Завершено \n.Одно поле может содержаться или не содержаться в двух экранированных кавычках, но только восемь полей могут содержать пробелы и другие символы, такие как /%?:

"A single field / % ?"

и может также содержать числа или косую черту, как показано ниже.

Пример двух строк, каждая с 20 полями:

14 S 20 ? OSE ? NHY "Norsk Hydro" NO0005052605 1 "20180921" 48.6 2068998276 NOK S I ? ? 1 Y\n

40 S 20 ? OSE ? "" "Boa SBL AS 13/18 FRN C" NO0010675051 1 "20180706" 45 0 NOK B ? ? ? 0.01 Y\n

Каким был бы безопасный и эффективный способ сделать это?

Я вижу, я могу заставить это работать, но это не очень элегантно ..

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете использовать Regex, чтобы найти вещи в этом направлении (вам нужно было бы сделать немного больше для указанных значений) ...

var value = @"14 S 20 ? OSE ? NHY ""Norsk Hydro"" NO0005052605 1 ""20180921"" 48.6 2068998276 NOK S I ? ? 1 Y"+"\n";
var pattern = new Regex(@"^(""(.*?)""|[^ ""]+)( (""(.*?)""|[^ ""]+)){19,19}\n$");
var match = pattern.Match(value);
if (match.Success)
{
    for (int ctr = 1; ctr < match.Groups.Count; ctr++)
    {
        Console.WriteLine("   Group {0}:  {1}", ctr, match.Groups[ctr].Value);
        int captureCtr = 0;
        foreach (Capture capture in match.Groups[ctr].Captures)
        {
            Console.WriteLine("      Capture {0}: {1}",
                captureCtr, capture.Value);
            captureCtr++;
        }
    }
}

Или, если вы хотите не-Regex решение: использовать string.Split используя пробел в конструкторе Queue<string> s, а затем обрабатывать очередь в цикле, Dequeue каждый элемент за раз.

Если элемент начинался с *Затем 1010 * имеет еще один цикл Dequeue, входящий в List<string> до тех пор, пока соответствующий элемент не заканчивается закрывающей кавычкой, после чего восстанавливают указанное значение, используя string.Join(" ", list).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...