解析一个字符串,似乎没有分隔符

时间:2014-03-04 20:49:42

标签: c# .net string

我需要解析以下字符串,以便将其插入到数据库中。分隔符是“`”:

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

我使用此

将字符串拆分为数组
var responseArray = response.Split('`');

然后responseArrray[]中的每个项目都是这样的:020 Some Description

如何从阵列中获取两个不同的部分?第一部分将是3或4个字符长。第二部分不超过35个字符。

由于我无法控制的一些荒谬的陌生感,第一和第二部分之间会有随机的空间。

6 个答案:

答案 0 :(得分:1)

您可以尝试此解决方案:

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()
             });

以下是LINQPad中的结果:

enter image description here

更新:我的第一个解决方案存在一些问题,因为在Trim之后使用了Take。这是另一种使用扩展方法的方法:

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;
    }
}

以下是测试结果:

enter image description here

答案 1 :(得分:1)

或者将其他两个答案放在一起,并获得更完整的内容:

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();
}

所以,基本上你使用第一个空格作为分隔符来创建2个字符串。然后你修剪第二个,因为修剪仅适用于前导和尾随空格,而不是介于两者之间的所有内容。

编辑:这是Brad M评论的直接实现。

答案 2 :(得分:0)

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();
}

修剪只删除每MSDN的前导/尾随空格,因此描述中的空格不会对您造成伤害。

答案 3 :(得分:0)

您可以通过找到第一个空格并制作substring来获得第一部分。第二个也是Substring。尝试这样的事情。

    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();
    }

答案 4 :(得分:0)

试试这个

string response =“020 Some Description 060 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('-');

答案 5 :(得分:0)

如果第一部分是整数 你需要考虑一些空的 对我来说,第一遍是空的

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();
                    }
                }
            }
        }
    }
}