首页 > 解决方案 > 如何将带分隔符的字符串拆分为 5 列

问题描述

如何将整个字符串提取为 5 列?

"1;2;3;4;5;A;AAA;AA;AAAA;AAAAA;NA;NA;通过;是;否;test1;test2;test3;test4;test5;Word4;Word5;Word3;Word2;Word1 "

像这样:

在此处输入图像描述

我想将最终结果按行放入列表中;

例如:

结果 1 =在此处输入图像描述

结果 2 =在此处输入图像描述

标签: c#

解决方案


该问题没有规定最终的数据结构。假设我们最后想要这样的东西:

List<string[]>
{
    string[]{ "1", "A", "NA", "test1", "Word4" }, 
    string[]{ "2", "AAA", "NA", "test2", "Word5" },
    ...
}

更好的结构化数据结构会更合适。

假设输入字符串不包含具有分隔符的单词;

var data = "1;2;3;4;5;A;AAA;AA;AAAA;AAAAA;NA;NA;PASS;YES;NO;test1;test2;test3;test4;test5;Word4;Word5;Word3;Word2;Word1";
var splitData = data.Split(';');
var columnCount = 5;

// We check that the input data has the right number of elements (multiple of columnCount).
if (splitData.Length % columnCount != 0)
{
    throw new InvalidOperationException();
}

var results = splitData
    .Select((columnVal, i) => (columnVal, i)) // projection of each element including its index.
    .GroupBy( x => x.i % columnCount, // group elements by 'row' [0,5,10,15,20][1,6,11,16,21][2,7,12,17,22]...
              x => x.columnVal, // selecting only the value (we don't need the index anymore).
              (_, columns) => columns.ToArray()) // putting all column values for each row in an array, here we could map to a different data structure.
    .ToList();

// the 'results' variable has the target data structure.

如果我们在控制台上显示解析后的数据:

for (var i = 0; i < results.Count; i++)
{
    var row = results[i];

    // each column value 'i' is in 'result[i]'
    var columnStr = string.Join(" | ", row);
    Console.WriteLine($"Row {i} -> {columnStr}");
}

/*
Row 0 -> 1 | A | NA | test1 | Word4
Row 1 -> 2 | AAA | NA | test2 | Word5
Row 2 -> 3 | AA | PASS | test3 | Word3
Row 3 -> 4 | AAAA | YES | test4 | Word2
Row 4 -> 5 | AAAAA | NO | test5 | Word1
*/

推荐阅读