【问题标题】:Splitting a string after x number of new lines在 x 个新行之后拆分字符串
【发布时间】:2015-10-07 14:08:10
【问题描述】:

我还没有设法在 .net 中在线找到解决方案。

我需要能够将大约 42,000 行的字符串分成每个 5,000 行的单独字符串。

字符串的形式

"some stuff\d\nsome things\d\n..."

重复大约 42,000 次。所以实际上我需要 9 个字符串,8 个将包含 5000 \d\n,一个将包含 2000。但它需要在一般情况下工作。

所以字符串需要在每 5000 次 \d\n 处断开并保存为单独的字符串。

【问题讨论】:

  • 你试过了吗?
  • 向我们展示足够多的输入数据以了解其格式,以及足够多的代码以了解您迄今为止所做的尝试。另外,那个孤立的句子“响应超时错误”是什么意思?
  • 我投票决定将此问题作为题外话结束,因为没有表现出任何努力
  • 已编辑,希望不那么含糊。
  • 我确实尝试了建议的答案,但我无法开始工作,因为我使用的课程是部分的。 String.Split() 方法似乎没有扩展功能以包括在一定数量的重复字符后拆分字符串。

标签: .net regex string split


【解决方案1】:

编辑以下说明:一旦您在每个 \d\n 上拆分了长字符串,则可以使用此通用扩展方法将字符串批量分成 5000 个批次,最后一批中剩余的部分:

string[] longList = reallyLongString
                   .Split(new string[] { "\d\n" }, StringSplitOptions.None);

var batchesOfStrings = longList.Batch(5000);

foreach (var batch in batchesOfStrings)
{
   … 
}

扩展方法(必须在静态类中):

public static IEnumerable<IList<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
{
    var batch = new List<T>(batchSize);

    foreach (var item in source)
    {
        batch.Add(item);
        if (batch.Count == batchSize)
        {
            yield return batch;
            batch = new List<T>(batchSize);
        }
    }

    if (batch.Any())
    {
        yield return batch;
    }
}

【讨论】:

  • 不相信这完全是我想要的。我想在 \d\n 之后拆分一个字符串,这可能意味着使用一些正则表达式?
  • string[] longList = reallyLongString.Split(new string[] { "\d\n" }, StringSplitOptions.None);
  • 这样只会拆分成42000个字符串,并不能解决问题。
  • .. 然后你调用var batches = longList.Batch(5000),如答案所示。
  • 我明白了。我设法解决了这个缺点来解决我原来的问题,但我会尝试这种方法,看看它是否回答了原来的问题。