C# 查找字符串拆分并更新每个属性

C# 查找字符串拆分并更新每个属性,c#,C#,我有一个类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 =

我有一个类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";
消息:示例消息 优先权:信息 时间:2016年9月21日下午1:13 标签:/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
    }

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

   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中添加一个方法

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

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

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;
    }
}
这里有一个简单的技巧

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

这是一种迂回的做法,但对我来说很有效:

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

拆分“{char}”生成一个字符串数组,其中包含您输入的字符的分隔符。无需调用ToString,并且返回的数组已编制为0索引。我的代码存在2个问题。1.消息在索引1处,一旦那个是派生的,那个么我就不能再派生任何东西了,因为消息被更改了2。时间也有冒号:in Time。我不会用“:”作为分隔符,因为你也在使用日期格式。@Danoram,我能用Regex做些什么吗,请建议!1您是否可以控制输入字符串?我建议将字符拆分为不太可能发生的字符,例如管道|。如何获取时间,因为它包含冒号:在时间中,我可以使用Regex吗?编辑以修复时间问题哦-我看到第二个冒号。保持原样:dataCls.Message.Replaceme:,me |;谢谢,但我在线路上出错了。。。this.Message=Message.SubstringindexMessage+8,indexPriority-indexMessage-9;我用给定的示例对此进行了测试。我假设indexMessage或indexProperty在tested by Your案例中为-1,这意味着缺少一些propertyName:value。