Sdp
Sdp

Reputation: 192

Split string into multiple smaller strings

I have a multiline textbox that contains 10 digit mobile numbers separated by comma. I need to achieve string in group of at least 100 mobile numbers.

100 mobile numbers will be separated by 99 comma in total. What i am trying to code is to split the strings containing commas less than 100

public static IEnumerable<string> SplitByLength(this string str, int maxLength) 
  {
    for (int index = 0; index < str.Length; index += maxLength) {
    yield return str.Substring(index, Math.Min(maxLength, str.Length - index));
  }
}

By using above code, I can achieve 100 numbers as 100 numbers will have 10*100(for mobile number)+99(for comma) text length. But the problem here is user may enter wrong mobile number like 9 digits or even 11 digits.

Can anyone guide me on how can I achieve this. Thank you in advance.

Upvotes: 0

Views: 118

Answers (3)

Steve
Steve

Reputation: 216293

This be can resolved with a simple Linq code

public static IEnumerable<string> SplitByLength(this string input, int groupSize)
{
    // First split the input to the comma.
    // this will give us an array of all single numbers
    string[] numbers = input.Split(',');

    // Now loop over this array in groupSize blocks
    for (int index = 0; index < numbers.Length; index+=groupSize)
    {
        // Skip numbers from the starting position and 
        // take the following groupSize numbers, 
        // join them in a string comma separated and return 
        yield return string.Join(",", numbers.Skip(index).Take(groupSize));
    }
}

Upvotes: 0

Gareth
Gareth

Reputation: 911

You have a few options,

  1. Put some kind of mask on the input data to prevent the user entering invalid data. In your UI you could then flag the error and prompt the user to reenter correct information. If you go down this route then something like this string[] nums = numbers.Split(','); will be fine.
  2. Alternatively, you could use regex.split or regex.match and match on the pattern. Something like this should work assuming your numbers are in a string with a leading comma or space

    Regex regex = new Regex("(\s|,)\d{10},)";

    string[] nums = regex.Split(numbers);

Upvotes: 0

Tim Schmelter
Tim Schmelter

Reputation: 460068

You could use this extension method to put them into max-100 number groups:

public static IEnumerable<string[]> SplitByLength(this string str, string[] splitBy, StringSplitOptions options, int maxLength = int.MaxValue)
{
    var allTokens = str.Split(splitBy, options);
    for (int index = 0; index < allTokens.Length; index += maxLength)
    {
        int length = Math.Min(maxLength, allTokens.Length - index);
        string[] part = new string[length];
        Array.Copy(allTokens, index, part, 0, length);
        yield return part;
    }
}

Sample:

string text = string.Join(",", Enumerable.Range(0, 1111).Select(i => "123456789"));
var phoneNumbersIn100Groups = text.SplitByLength(new[] { "," }, StringSplitOptions.None, 100);
foreach (string[] part in phoneNumbersIn100Groups)
{
    Assert.IsTrue(part.Length <= 100);
    Console.WriteLine(String.Join("|", part));
}

Upvotes: 3

Related Questions