正在读取.Log文件中的特定行

本文关键字:文件 读取 Log | 更新日期: 2023-09-27 17:59:57

我有一个日志文件,正在读取到不同的对象中。一个对象从包含单词"Announcemessage"的行开始,接下来的行包含属于该消息的数据。此条目在包含单词"Disposed"的行处停止。我想读取这两行之间的所有数据,其中包含某些单词。

我目前正在使用字典,因为带有"Announcemessage"的行也包含UID,但下面的行包含该UID的数据。

你会怎么做?

这就是我到目前为止所想到的。

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

以及IsMeterEntry和IsNoLongerMeterEntry

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

正在读取.Log文件中的特定行

实现一个具有两个状态的简单状态机:IgnoreLine(初始状态)和Announce。

for each line in log
   if line contains "Announce message"
     read UID
     create a StringBuilder
     set state=Announce
   else if line contains "Disposed"
     store the StringBuilder's content in the dictionary[uid]
     set state=IgnoreLine
   else if state==Announce and line contains "certain words"
     append line to StringBuilder