C# 如何使用C读取文本文件中的日期#

C# 如何使用C读取文本文件中的日期#,c#,text-files,C#,Text Files,我正在使用C#在本地位置(C:\temp\log.txt)的文本文件中编写日志。文本文件存储如下 2011-11-17 23:05:17,266 [6] FATAL Application 2011-11-17 23:05:18,094 [6] FATAL Service 2011-11-17 23:17:08,862 [6] FATAL Receipts - SaveReceipts System.InvalidOperationException: Sequence contai

我正在使用C#在本地位置(C:\temp\log.txt)的文本文件中编写日志。文本文件存储如下

 2011-11-17 23:05:17,266 [6] FATAL Application

 2011-11-17 23:05:18,094 [6] FATAL Service

 2011-11-17 23:17:08,862 [6] FATAL Receipts - SaveReceipts
 System.InvalidOperationException: Sequence contains no elements
 at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
 at GID.AAFramework.EntityWrapper.ReceiptFacade.SaveReceipts(IEnumerable`1 records,     String user) in     c:\AdvancedAnalyticsProjects\Surya\Trunk\dotnet_src\GID.AAFramework.EntityWrapper\ReceiptFacade.cs:line 632
现在,我想阅读此文件,并希望获取第一次日志输入的日期最后日期

如何在此文本文件中获取第一次日期和最后更新日期

现在,我正在使用以下代码阅读此文本文件:

StreamReader sr = new StreamReader(FileLocation);
if (sr != null)
{
  linelist.Add(sr.ReadToEnd());
  LogInfoByDate.Add(FileLocation, "StartDate:" + linelist.First().Substring(0, 10) + "|" + "EndDate:" + linelist.Last().Substring(0, 10));               
}

如果异常行是单个的,但其不适用于具有多行的异常,则我编写的代码用于获取第一次日期和最后更新日期,如上所示。现在这是我的问题。有人能告诉我如何在这个文本文件中获取第一个和最后一个日期吗?

下面是一个如何解析的示例:

//日志项的init datetime列表
列表日志日期=新列表();
//定义正则表达式字符串
字符串模式=@“(?(\d){4}-(\d){2}-(\d){2}\s(\d){2}:(\d){2}:(\d){2})”;
正则表达式reg=新正则表达式(模式);
//读取日志内容
字符串logContent=File.ReadAllText(“test.log”);
//运行正则表达式
MatchCollection matches=注册匹配(logContent);
//迭代匹配
foreach(匹配中的匹配m)
{
DateTime logTime=DateTime.Parse(m.Groups[“logDate”].Value);
日志日期。添加(日志时间);
}
//显示第一个和最后一个条目
Console.WriteLine(“First:+logDates.First());
Console.WriteLine(“Last:+logDates.Last());
我删除了逗号几毫秒,只是为了便于解析


关于Florian

,以下是一个如何解析的示例:

//日志项的init datetime列表
列表日志日期=新列表();
//定义正则表达式字符串
字符串模式=@“(?(\d){4}-(\d){2}-(\d){2}\s(\d){2}:(\d){2}:(\d){2})”;
正则表达式reg=新正则表达式(模式);
//读取日志内容
字符串logContent=File.ReadAllText(“test.log”);
//运行正则表达式
MatchCollection matches=注册匹配(logContent);
//迭代匹配
foreach(匹配中的匹配m)
{
DateTime logTime=DateTime.Parse(m.Groups[“logDate”].Value);
日志日期。添加(日志时间);
}
//显示第一个和最后一个条目
Console.WriteLine(“First:+logDates.First());
Console.WriteLine(“Last:+logDates.Last());
我删除了逗号几毫秒,只是为了便于解析


关于Florian,这里有一种使用LINQ和:


下面是一种使用LINQ和:



应该不是
sr.ReadLine()为什么不使用FileInfo的CreationTime和LastWriteTime?目前,您没有逐行处理文件,您只是在阅读整个内容。在我看来,你应该逐行阅读,检查它是否匹配特定的模式(可能是正则表达式),如果匹配,在子字符串上使用一些DateTime.ParseExact来获取日期…?为什么不以易于解析的格式编写日志,或者使用
Regex来转义换行符。escape
?@NikhilAgrawal:我用这种方式逐行读取文本文件,这就是我使用的原因。你能告诉我正确的方法吗?应该是
sr.ReadLine()为什么不使用FileInfo的CreationTime和LastWriteTime?目前,您没有逐行处理文件,您只是在阅读整个内容。在我看来,你应该逐行阅读,检查它是否匹配特定的模式(可能是正则表达式),如果匹配,在子字符串上使用一些DateTime.ParseExact来获取日期…?为什么不以易于解析的格式编写日志,或者使用
Regex来转义换行符。escape
?@NikhilAgrawal:我用这种方式逐行读取文本文件,这就是我使用的原因。你能告诉我做这件事的正确方法吗?我用了你的代码和它现在的工作方式。非常感谢您的代码:-)@SuryaKavitha:顺便说一句,您可以将cansik的正则表达式与我的
DateTime.TryParseExact
结合起来。我认为这将是最健壮的方法,并解析millis。但是你需要修改正则表达式来获得millis。你能解释一下你说了什么吗?我使用了你的代码,它现在可以工作了。非常感谢您的代码:-)@SuryaKavitha:顺便说一句,您可以将cansik的正则表达式与我的
DateTime.TryParseExact
结合起来。我认为这将是最健壮的方法,并解析millis。但是你需要修改正则表达式来得到millis。你能解释一下你说了什么吗?我不得不投票支持这个。它解决了我所面临的问题,在每一行的开头都能得到最早和最晚的日期!我不得不投票支持这个。它解决了我所面临的问题,在每一行的开头都能得到最早和最晚的日期!
DateTime d = DateTime.Now;
var format = "yyyy-MM-dd HH:mm:ss,fff";
var fileDates = System.IO.File.ReadAllLines(path)
                .Where(l => l.Length >= format.Length
                        && DateTime.TryParseExact(l.Substring(0, format.Length)
                                                , format
                                                , CultureInfo.InvariantCulture
                                                , DateTimeStyles.None
                                                , out d)
                )
                .Select(l => d)
                .OrderBy(dt => dt);

if (fileDates.Any())
{
    DateTime firstDate = fileDates.First();  // 2011-11-17 23:05:17,266
    DateTime lastDate  = fileDates.Last();   // 2011-11-17 23:17:08,862
}