Question

I have the following string that I need to parse out so I can insert them into a DB. The delimiter is "`":

`020             Some Description       `060       A Different Description        `100       And Yet Another       `

I split the string into an array using this

var responseArray = response.Split('`');

So then each item in the responseArrray[] looks like this: 020 Some Description

How would I get the two different parts out of that array? The 1st part will be either 3 or 4 characters long. 2nd part will be no more then 35 characters long.

Due to some ridiculous strangeness beyond my control there is random amounts of space between the 1st and 2nd part.

Was it helpful?

Solution

Or put the other two answers together, and get something that's more complete:

string[] response = input.Split(`);

foreach (String str in response) {
  int splitIndex = str.IndexOf(' ');

  string num = str.Substring(0, splitIndex);  
  string desc = str.Substring(splitIndex);      
  desc.Trim();
}

so, basically you use the first space as a delimiter to create 2 strings. Then you trim the second one, since trim only applies to leading and trailing spaces, not everything in between.

Edit: this a straight implementation of Brad M's comment.

OTHER TIPS

You can try this solution:

var inputString = "`020             Some Description       `060       A Different Description        `100       And Yet Another       `";

int firstWordLength = 3;
int secondWordMaxLength = 35;

var result =inputString.Split('`')
            .SelectMany(x => new[]
             {
               new String(x.Take(firstWordLength).ToArray()).Trim(), 
               new String(x.Skip(firstWordLength).Take(secondWordMaxLength).ToArray()).Trim()
             });

Here is the result in LINQPad:

enter image description here

Update: My first solution has some problems because the use of Trim after Take.Here is another approach with an extension method:

public static class Extensions
{
    public static IEnumerable<string> GetWords(this string source,int firstWordLengt,int secondWordLenght)
    {
        List<string> words = new List<string>();
        foreach (var word in source.Split(new[] {'`'}, StringSplitOptions.RemoveEmptyEntries))
        {
            var parts = word.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
            words.Add(new string(parts[0].Take(firstWordLengt).ToArray()));
            words.Add(new string(string.Join(" ",parts.Skip(1)).Take(secondWordLenght).ToArray()));
        }
        return words;
    }
}

And here is the test result:

enter image description here

Try this

string response = "020 Some Description060 A Different Description 100 And Yet Another"; var responseArray = response.Split('`');

        string[] splitArray = {};
        string result = "";

        foreach (string it in responseArray)
        {
            splitArray = it.Split(' ');
            foreach (string ot in splitArray)
            {
                if (!string.IsNullOrWhiteSpace(ot))
                    result += "-" + ot.Trim();
            }
        }

        splitArray = result.Substring(1).Split('-');
string[] entries = input.Split('`');

foreach (string s in entries)
   GetStringParts(s);

IEnumerable<String> GetStringParts(String input)
{
   foreach (string s in input.Split(' ')
      yield return s.Trim();
}

Trim only removes leading/trailing whitespace per MSDN, so spaces in the description won't hurt you.

If the first part is an integer And you need to account for some empty
For me the first pass was empty

public void parse()
{
    string s = @"`020             Some Description       `060       A Different Description        `100       And Yet Another       `";
    Int32 first;
    String second;
    if (s.Contains('`'))
    {
        foreach (string firstSecond in s.Split('`'))
        {
            System.Diagnostics.Debug.WriteLine(firstSecond);
            if (!string.IsNullOrEmpty(firstSecond))
            {
                firstSecond.TrimStart();
                Int32 firstSpace = firstSecond.IndexOf(' ');
                if (firstSpace > 0)
                {
                    System.Diagnostics.Debug.WriteLine("'" + firstSecond.Substring(0, firstSpace) + "'");
                    if (Int32.TryParse(firstSecond.Substring(0, firstSpace), out first))
                    {
                        System.Diagnostics.Debug.WriteLine("'" + firstSecond.Substring(firstSpace-1) + "'");
                        second = firstSecond.Substring(firstSpace).Trim();
                    }
                }
            }
        }
    }
}

You can get the first part by finding the first space and make a substring. The second is also a Substring. Try something like this.

    foreach(string st in response)
    {
        int index = response.IndexOf(' ');
        string firstPart = response.Substring(0, index);


        //string secondPart = response.Substring(response.Lenght-35);
        //better use this
        string secondPart = response.Substring(index);
        secondPart.Trim();
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top