C # - проблема с разделением строки

У меня есть набор значений, на основе которых я разбил строку

string[] seperator = new string[9];
        seperator[0] = "*";  //is the client
        seperator[1] = "/";  //is the name of company
        seperator[2] = "(";     //name of the market    
        seperator[5] = ":";    //ID
        seperator[6] = "?";    //orderType
        seperator[3] = "!@";   //realtive Time
        seperator[4] = "!+";   //
        seperator[7] = "+";    //quantity
        seperator[8] = "@";//price
string[] result = values.Split(seperator, StringSplitOptions.None);

Например: входная строка - * A / AB (M! @ 12: 6? SIMPLE! + 5 + 2

OUTPUT
    [0]: ""
    [1]: "A"
    [2]: "AB"
    [3]: "M"
    [4]: "12"
    [5]: "6"
    [6]: "SIMPLE"
    [7]: "5"
    [8]: "2"

Например: строка ввода * A (M! @ 12? SIMPLE! + 5 + 2 / AB: 6

OUTPUT:
    [0]: ""
    [1]: "A"
    [2]: "M"
    [3]: "12"
    [4]: "SIMPLE"
    [5]: "5"
    [6]: "2"
    [7]: "AB"
    [8]: "6"

Проблема, с которой я столкнулся, заключается в следующем: как я могу сказать, что A - это клиент, AB - это компания и т. Д.

как порядок, в котором пользователь может вводить эту информацию СЛУЧАЙНО ... Если он не вводит ни одно из этих значений, изменяется длина результата?


person Community    schedule 21.09.2009    source источник
comment
Если нет маркеров, идентифицирующих поля, а порядок полей случайный, я не понимаю, как вы собираетесь это делать.   -  person monkey_p    schedule 21.09.2009
comment
извини, я видел только идентификаторов нет   -  person monkey_p    schedule 21.09.2009


Ответы (3)


Используя что-то вроде этого

SortedList<int, string> list = new SortedList<int, string>();
            string[] seperator = new string[9];
            seperator[0] = "*";  //is the client
            seperator[1] = "/";  //is the name of company
            seperator[2] = "(";     //name of the market    
            seperator[5] = ":";    //ID
            seperator[6] = "?";    //orderType
            seperator[3] = "!@";   //realtive Time
            seperator[4] = "!+";   //
            seperator[7] = "+";    //quantity
            seperator[8] = "@";//price
            string val = "*A/AB(M!@12:6?SIMPLE!+5+2";

            for (int iSep = 0; iSep < seperator.Length; iSep++)
                list.Add(val.IndexOf(seperator[iSep]), val);

предоставит вам список позиций, с которых начинаются разделители, в любом порядке, вводимом пользователем, а затем вы можете использовать подстроку для получения значений

person Community    schedule 21.09.2009

Как насчет использования одного или нескольких регулярных выражений с именованными группами захвата и индексации совпадений по имени?

Посмотрите, например, эту страницу msdn или этот пост.

Вот пример для начала:

using System;
using System.Text.RegularExpressions;

class Program {
    static void Main(string[] args) {

        Regex regex = new Regex(@"(?:\*(?<client>\w+))|(?:/(?<company>\w+))",RegexOptions.Compiled);
        string input = "*A/AB(M!@12:6?SIMPLE!+5+2";

        foreach (Match match in regex.Matches (input)) {
            if (match.Groups["client"].Success) {
                Console.WriteLine("Client = {0}", match.Groups["client"].Value);
            } else if (match.Groups["company"].Success) {
                Console.WriteLine("Company = {0}", match.Groups["company"].Value);
            }
        }


    }
}

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

Кроме того, есть инструменты, позволяющие экспериментировать и помогающие писать регулярные выражения, например Expresso и Регулятор.

person Paolo Tedesco    schedule 21.09.2009

Как насчет выполнения ряда замен во входной строке, чтобы преобразовать ее в более управляемый формат. Например.

inputString = inputString.Replace("*", ",Client=").Replace("/", ",Company=");

Затем вы можете разделить на «,» и получить список строк с их заголовками, а затем разделить их на «=», чтобы получить заголовок и значение.

person Community    schedule 21.09.2009