C# 查找字符串拆分并更新每个属性
我有一个类DataCls,从其他一些源我得到了propertyName:value格式的消息字符串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 =
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。