【问题标题】:how to spilt a string with separator into 5 columns [duplicate]如何将带分隔符的字符串拆分为5列[重复]
【发布时间】:2020-11-03 22:24:18
【问题描述】:

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

"1;2;3;4;5;A;AAA;AA;AAAA;AAAAAA;NA;NA;PASS;YES;NO;test1;test2;test3;test4;test5;Word4;Word5;Word3; Word2;Word1"

像这样:

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

例如:

结果 1 =

结果 2 =

【问题讨论】:

  • 您尝试了哪些方法,哪些方法不起作用?如果您知道分隔符,则可以使用 string.Split() 将其拆分为单独的元素。如果列数是静态的,那么您可以将元素数除以该计数以获得行数。使用该值,您可以遍历元素并将它们添加到矩阵中。你被困在哪里了?
  • 最终的结果类型应该是什么?您是否希望将其包含在数据表中?字符串列表?每行一个字符串?需要一些明确的信息才能提供帮助,否则您将获得每个可能版本的答案,而且没有一个适合您。
  • 你为什么首先使用分隔字符串?

标签: c#


【解决方案1】:

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

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
*/

【讨论】:

    【解决方案2】:

    这是带有断言测试的解决方案

        string input = "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 elementSplit = input.Split(';');
        int columnNumber = 5;
        List<string> result = new List<string>();
        for (int columnIndex = 0; columnIndex < columnNumber; columnIndex++)
        {
            StringBuilder row = new StringBuilder();
            for (int i = columnIndex; i < elementSplit.Length; i+= columnNumber)
            {
                row.Append(elementSplit[i]);
                row.Append(";");
            }
            row.Remove(row.Length - 1, 1);
            result.Add(row.ToString());
        }
        Assert.AreEqual("1;A;NA;test1;Word4", result[0]);
        Assert.AreEqual("2;AAA;NA;test2;Word5", result[1]);
    

    【讨论】:

    • 有什么建议为什么是-1?代码正在执行预期的操作。
    • 我们不知道会发生什么。您将其作为字符串输出到列表中,可以是数据表,也可以是我们所知道的 list>。没有更多信息,这个答案只是暗中猜测。
    • @KrishnaMuppalla 首先这是我的代码。其次,我修改它以使用不同的数据。
    • @gilliduck 这听起来像是作者而不是我的问题:)
    猜你喜欢
    • 2015-11-06
    • 2012-10-17
    • 2018-07-23
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多