【问题标题】:looking for string split and update each property寻找字符串拆分并更新每个属性
【发布时间】:2017-01-29 23:34:04
【问题描述】:

我有一个“DataCls”类,从其他来源我得到“消息”字符串,格式为“propertyName:value”。

public class DataCls
{
    public string Message { get; set; }
    public string Priority { get; set; }
    public DateTime Time { get; set; }
    public string Tag { get; set; }
}

dataCls.Message = "[AE][1W] Message:Console Station is not available Priority:Info Time:Sep 21 2016  1:13PM Tag:/System Components/R431ESV/Stations/Console Stations/CStn01";
  1. 消息:示例消息
  2. 优先级:信息
  3. 时间:2016 年 9 月 21 日下午 1:13
  4. 标签:/abc/pqr/xyz

现在我需要拆分此字符串并使用上述值更新“DataCls”类的每个属性。请推荐!!!

我用下面的方法试过了,但没有用,

static void Main(string[] args)
    {
        DataCls dataCls = new DataCls();

        dataCls.Message = "[AE][1W] Message:sample message Priority:Info Time:Sep 21 2016  1:13PM Tag:/abc/pqr/xyz";

        dataCls.Message = dataCls.Message.Split(':')[1].ToString();
        dataCls.Priority = dataCls.Message.Split(':')[2].ToString();//error
    }

【问题讨论】:

  • Split('{char}') 生成一个字符串数组,其中包含您输入的字符的分隔符。无需调用ToString(),返回的数组索引为0。
  • 我的代码有 2 个问题。 1. 消息在索引 1 处,一旦派生出来,那么随着消息的变化,我无法进一步派生任何东西 2. 时间也有冒号(:) 及时。
  • 我不会使用 ':' 作为您的分隔符,因为您也在日期格式中使用它..
  • @Danoram,有什么我可以用正则表达式做的吗,请建议!1
  • 您可以控制输入字符串吗?我建议将字符更改为拆分为不太可能发生的字符,例如管道|

标签: c#


【解决方案1】:

您可以暂时将您的时间中的冒号更改为管道,拆分,然后替换

   static void Main(string[] args)
{
    DataCls dataCls = new DataCls();

    dataCls.Message = "[AE][1W] Message:sample message Priority:Info Time:Sep 21 2016  1:13PM Tag:/abc/pqr/xyz";
    dataCls.Message = dataCls.Message.Replace("me:",me|");
    int index = dataCls.Message.IndexOf("Tag")-6;
    dataCls.Message.SubString(index,1)="|";
    string[] parts = dataCls.Message.Split(';');
    dataCls.Message = parts[1];
    dataCls.Priority = parts[3].Replace("|",":");
    dataCls.Tag = parts[5];
}

【讨论】:

  • 如何获取时间,因为它包含冒号(:) 时间
  • 有什么我可以使用正则表达式的吗?
  • 已编辑以修复时间问题
  • 哦 - 我看到了第二个冒号。等一下
  • 什么是:dataCls.Message.Replace("me:", me | ");
【解决方案2】:

您可以在 DataCls 中添加方法

public class DataCls
{
    public string Message { get; set; }
    public string Priority { get; set; }
    public DateTime Time { get; set; }
    public string Tag { get; set; }

    public void ProcessMessage(string message)
    {
        var indexMessage = message.IndexOf("Message");
        var indexPriority = message.IndexOf("Priority");
        var indexTime = message.IndexOf("Time");
        var indexTag = message.IndexOf("Tag");

        this.Message = message.Substring(indexMessage + 8, indexPriority - indexMessage - 9);
        this.Priority = message.Substring(indexPriority + 9, indexTime - indexPriority - 10);
        var time = message.Substring(indexTime + 5, indexTag - indexTime - 6);
        this.Time = DateTime.Parse(time);
        this.Tag = message.Substring(indexTag + 4, message.Length - indexTag-4);
    }
}

【讨论】:

  • 谢谢,但我在行出现错误... this.Message = message.Substring(indexMessage + 8, indexPriority - indexMessage - 9);
  • 我用给定的例子对此进行了测试。我假设 indexMessage 或 indexProperty 在您测试的情况下为 -1,这意味着某些“propertyName:value”缺失。
【解决方案3】:

您可以使用消息中的固定词来获取它之间的部分:

static void Main()
{
    DataCls ci = new DataCls();
    ci.Parse( "[AE][1W] Message:Console Station is not available Priority:Info Time:Sep 21 2016  1:13PM Tag:/System Components/R431ESV/Stations/Console Stations/CStn01" );
}

public class DataCls
{
    public string Message { get; set; }
    public string Priority { get; set; }
    public DateTime Time { get; set; }
    public string Tag { get; set; }

    public void Parse( string parseStr )
    {
        const string MESSAGE_MARKER = "Message:";
        const string PRIORITY_MARKER = "Priority:";
        const string TIME_MARKER = "Time:";
        const string TAG_MARKER = "Tag:";

        this.Message = GetTextPart( parseStr, MESSAGE_MARKER, PRIORITY_MARKER );
        this.Priority = GetTextPart( parseStr, PRIORITY_MARKER, TIME_MARKER );
        this.Time = DateTime.Parse( GetTextPart( parseStr, TIME_MARKER, TAG_MARKER ) );
        this.Tag = GetTextPart( parseStr, TAG_MARKER, null );
    }

    private string GetTextPart( string text, string before, string after )
    {
        string result = null;

        int posBefore = text.IndexOf( before );

        if( after != null )
        {
            int posAfter = text.IndexOf( after );
            result = text.Remove( posAfter ).Substring( posBefore + before.Length ).TrimEnd();
        }
        else
            result = text.Substring( posBefore + before.Length );

        return result;
    }
}

【讨论】:

    【解决方案4】:

    这是一个简单的技巧

    using System;
    namespace program
    {
        class program
        {
            static void Main(string[] args)
            {
                DataCls dataCls = new DataCls();
    
                string message = "[AE][1W] Message:sample message Priority:Info Time:Sep 21 2016  1:13PM Tag:/abc/pqr/xyz";
                message = message.Replace("Message:","::").Replace("Priority:","::").Replace("Time:","::").Replace("Tag:","::");
                var parts = message.Split("::");
                dataCls.Message = parts[0];
                dataCls.Priority = parts[1];
                dataCls.Time  = Convert.ToDateTime(parts[2]);
                dataCls.Tag = parts[3];
            }
        }
    
        public class DataCls
        {
            public string Message { get; set; }
            public string Priority { get; set; }
            public DateTime Time { get; set; }
            public string Tag { get; set; }
        }
    }
    

    【讨论】:

      【解决方案5】:

      有点迂回的做法,但它对我有用:

              static void Main(string[] args)
          {
              DataCls dataCls = new DataCls();
      
              string Message = "[AE][1W] Message:sample message Priority:Info Time:Sep 21 2016  1:13PM Tag:/abc/pqr/xyz";
      
              dataCls.Message = Message.Substring(Message.IndexOf("Message:")+8);
              dataCls.Message = dataCls.Message.Substring(0, dataCls.Message.LastIndexOf("Priority"));
      
              dataCls.Priority = Message.Substring(Message.IndexOf("Priority:")+9);
              dataCls.Priority = dataCls.Priority.Substring(0,dataCls.Priority.LastIndexOf("Time"));
      
              string Time = Message.Substring(Message.IndexOf("Time"));
              Time = Time.Substring(0, Time.LastIndexOf("Tag"));
              dataCls.Time = Convert.ToDateTime(Time.Substring(Time.IndexOf(":")+1));
      
              dataCls.Tag = Message.Substring(Message.IndexOf("Tag:")+4);
              dataCls.Tag = dataCls.Tag.Substring(0);
          }
      

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 2012-03-17
        相关资源
        最近更新 更多