如何根据多行日志中的时间戳提取数据?

时间:2015-08-19 13:56:44

标签: c# parsing timestamp

我的日志包含以下格式的数据。我的问题是 - 让我说我在日志中搜索12:22 PM,我怎样才能提取所有与该时间戳有关的信息并输出...有没有办法可以说从12:22输出所有内容PM直到你打到下一个时间戳?这基本上是我想以编程方式做的事情。任何帮助将不胜感激。谢谢!

12:22 PM
    abc 
    def
       ghi
    abc
12:33 PM
    abc
    def

上述案例的输出就是这个 -

   12:22 PM
        abc 
        def
           ghi
        abc

另请注意:可能有多个具有相同时间戳的日志条目,例如,在同一时间戳下可能有2个或3个或更多条目,即12:22 PM

1 个答案:

答案 0 :(得分:0)

您可以编写一个静态函数,它将从给定的时间戳中提取所需的日志,如下所示:

注意:我没有处理异常情况[如FileNotFoundException和其他异常],请根据您的要求处理它们。

 static string GetLogsByTimeStamp(string timeStamp)
    {
        if (!string.IsNullOrEmpty(timeStamp))
        {
            string filePath = @"F:\log.txt"; //your logfile path here
            string format = "hh:mm tt";
            TimeSpan reqTimeStamp = DateTime.ParseExact(timeStamp.Trim(),
                        format, CultureInfo.InvariantCulture).TimeOfDay;
            StringBuilder selectiveLogs = new StringBuilder(string.Empty);
            bool startReading = false;
            foreach (var line in File.ReadLines(filePath))
            {
                string[] arrItems = line.Split(new[] { ' ' }, 
                            StringSplitOptions.RemoveEmptyEntries);
                DateTime logDateTime = DateTime.MinValue;
                bool isDateTimeValid = false;
                if (arrItems != null && arrItems.Length > 1)
                    DateTime.TryParseExact(string.Format("{0}{1}{2}", 
                        arrItems[0].Trim(), " ", arrItems[1].Trim()), 
                                        format, CultureInfo.InvariantCulture,
                                        DateTimeStyles.None, out logDateTime);
                TimeSpan logTimeStamp = logDateTime.TimeOfDay;
                if ((!startReading && logTimeStamp == reqTimeStamp) ||   
                                   (startReading && !isDateTimeValid))
                    startReading = true;
                if (startReading && logTimeStamp > reqTimeStamp)
                {
                    startReading = false;
                    break; // no need to continue when you know that u 
                           //reached greater timestamp than required.
                }
                if (startReading)
                    selectiveLogs.AppendLine(line);
            }
            return selectiveLogs.ToString();
        }
        else
            return string.Empty;
    }

您可以使用以下静态功能:

string requiredLog = GetLogsByTimeStamp("12:22 PM");