我的日志包含以下格式的数据。我的问题是 - 让我说我在日志中搜索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
答案 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");