Разделение строки пробелом / двумя пробелами после символа - PullRequest
1 голос
/ 31 января 2020

Рассмотрим количество строк, в которых предполагается, что они содержат «ключи» вида «Wxxx», где x - цифры от 0 до 9. Каждый из них может содержать только один или несколько элементов, разделенных символом «,» и двумя пробелами. Например:

W123
W432
W546,  W234,  W167

Те, которые содержат несколько «ключей», должны быть разбиты на массивы. Итак, последний из приведенных выше примеров должен быть разбит на массив, подобный следующему: {"W546", "W234", "W167"}.

В качестве быстрого решения на ум приходит String.Split, но, насколько я знаю, он может взять один символ, как ','. Проблема в том, что он будет возвращать массив с таким: {"W546", " W234", " W167"}. Два пробела во всех записях массива, начиная со второго, возможно, можно удалить с помощью Substring, но есть ли лучшее решение?

Для контекста эти значения хранятся в электронной таблице, и предполагается, что они прошли проверку данных, чтобы убедиться, что «ключи» разделены запятой и двумя пробелами.

while ((ws.Cells[row,1].Value!=null) && (ws.Cells[row,1].Value.ToString().Equals("")))
{
    // there can be one key, or multiple keys separated by ','
    if (ws.Cells[row,keysCol].Value.ToString().Contains(','))
    {
        // there are multiple
        // need to split the ones in this cell separated by a comma           
    }
    else
    {
        // there is one
    }

    row++;
}

Ответы [ 4 ]

4 голосов
/ 31 января 2020

Вы можете просто указать ',' и ' ' в качестве разделителей и RemoveEmptyEntries.

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

List<string> cells = new List<string>() { "W123", "W432", "W546,  W234,  W167" };
List<string> keys = new List<string>();

foreach (string cell in cells)
{
    keys.AddRange(cell.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries));
}

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

2 голосов
/ 31 января 2020

Вы можете использовать старый фаворит - регулярные выражения.

Вот два варианта 'L oop' или 'LINQ'.

    static void Main(string[] args)
    {
        var list = new List<string>{"W848","W998, W748","W953, W9484, W7373","W888"};

        Console.WriteLine("LINQ");
        list.ForEach(l => TestSplitRegexLinq(l));

        Console.WriteLine();
        Console.WriteLine("Loop");
        list.ForEach(l => TestSplitRegexLoop(l));
    }


    private static void TestSplitRegexLinq(string s)
    {
        string pattern = @"[W][0-9]*";                
        var reg = new Regex(pattern);
        reg.Matches(s).ToList().ForEach(m => Console.WriteLine(m.Value));
    }



    private static void TestSplitRegexLoop(string s)
    {
        string pattern = @"[W][0-9]*";                
        var reg = new Regex(pattern);
        foreach (Match m in reg.Matches(s))
        {
            Console.WriteLine(m.Value);
        }
    }

Просто замените Console.Write с чем угодно: например. myList.Add(m.Value).

Вам потребуется добавить пространство имен: using System.Text.RegularExpressions;

2 голосов
/ 31 января 2020

Сначала удалите лишний пробел (используя Replace()), , затем используйте разделение.

var input = "W546, W234, W167";
var normalized = input.Replace(", ",",");  
var array = normalized.Split(',');

Таким образом, вы обрабатываете запятую, за которой следует пробел, точно такой же, как вы лечить запятой. Если может быть два пробела, вы также можете заменить это:

var input = "W546,  W234, W167";
var normalized = input.Replace("  "," ").Replace(", ",",");  
var array = normalized.Split(',');
0 голосов
/ 31 января 2020

После попытки ввода. NET fiddle, я думаю, что у меня может быть решение:

// if there are multiple
string keys = ws.Cells[row,keysCol].Value.ToString();

// remove spaces
string keys_normalised = keys.Replace(" ", string.Empty);
Console.WriteLine("Checking that spaces have been removed: " + keys3_normalised + "\n");

string[] splits = keys3_normalised.Split(',');
for (int i = 0; i < splits.Length; i++)
{
    Console.WriteLine(splits[i]);
}

Это приводит к следующему выводу в консоли:

Checking that spaces have been removed: W456,W234,W167

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