C# 读取.Log文件中的特定行
我有一个正在读取到不同对象的日志文件。一个对象从包含单词“announcemessage”的行开始,下面的行包含属于该消息的数据。此条目在包含单词“Disposed”的行停止。 我想读取这两行之间的所有数据,其中包含某些单词 我目前正在使用字典,因为带有“announcemessage”的行也包含UID,但下面的行包含该UID的数据 你会怎么做 这就是我到目前为止所想到的C# 读取.Log文件中的特定行,c#,C#,我有一个正在读取到不同对象的日志文件。一个对象从包含单词“announcemessage”的行开始,下面的行包含属于该消息的数据。此条目在包含单词“Disposed”的行停止。 我想读取这两行之间的所有数据,其中包含某些单词 我目前正在使用字典,因为带有“announcemessage”的行也包含UID,但下面的行包含该UID的数据 你会怎么做 这就是我到目前为止所想到的 public static void P2PLogParser(List<FileInfo> fileList)
public static void P2PLogParser(List<FileInfo> fileList)
{
foreach (FileInfo fi in fileList)
{
//Læser alle linier i csv fil
foreach (var line in File.ReadAllLines(fi.FullName))
{
string MeterUID = GetMeterUID(line);
string MimHashcode = GetMimHashcode(line);
string FirmwareUploadStatus = GetFirmwareUploadStatus(line);
string IsKnown = GetIsKnown(line);
DateTime P2PTimeStamp = GetTimestamp(line);
if (IsMeterEntry(line) && !meters.ContainsKey(MeterUID))
{
string MeterNr = GetMeterUID(line).Replace("4B414D", "");
int meternr = int.Parse(MeterNr, System.Globalization.NumberStyles.HexNumber);
meters.Add(MeterUID, new Meter()
{
MeterUID = MeterUID,
MeterNR = meternr,
P2Pmeterentry = new List<P2PMeterEntry>()
});
}
if (IsMeterEntry(line))
{
P2PMeterEntry p2pmeter = new P2PMeterEntry
{
P2PTimeStamp = P2PTimeStamp,
MimHashcode = MimHashcode,
FirmwareUploadStatus = FirmwareUploadStatus,
IsKnown = IsKnown,
P2PMetersession = new List<P2PMeterSession>()
};
if (IsNoLongerMeterEntry(line))
{
string SessionLevel = GetLevel(line);
string SessionMessage = GetSessionMessage(line);
string Context = GetSessionContext(line);
P2PMeterSession MeterSession = new P2PMeterSession
{
SessionTimeStamp = P2PTimeStamp,
SessionLevel = SessionLevel,
SessionMessage = SessionMessage,
Context = Context
};
meterSession.Add(MeterSession);
}
meters[MeterUID].P2Pmeterentry.Add(p2pmeter);
}
}
}
}
实现一个具有两种状态的简单状态机:IgnoreLine(初始状态)和annound 日志中每行的
如果行包含“公告消息”
读UID
创建一个StringBuilder
设置状态=宣布
否则,如果行包含“Disposed”
将StringBuilder的内容存储在字典[uid]中
设置状态=忽略线
如果state==annound且行包含“某些单词”,则为else
将行附加到StringBuilder
如何将状态机应用于我的代码?对不起,我是个傻瓜:你需要做的,就是引入状态
变量、枚举或整数。此外,还必须用逻辑替换StringBuilder
。我使用了StringBuilder
,因为我指的是原始问题,其中只提到读取两行之间的所有数据。您稍后添加了代码示例。
//IsMeterSession
public static bool IsMeterEntry(string text)
{
return text.ToLower().Contains("announce message received:");
}
public static bool IsNoLongerMeterEntry(string text)
{
return text.ToLower().Contains("context - disposed");
}