2012-06-05 31 views
1

我在我的本地位置寫我日誌在文本文件閱讀文本文件日期:使用C#(C \ TEMP \ log.txt的)。存儲如下如何使用C#

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

此代碼我寫服用第一次日期和最後更新日期,如果例外線是單但其不工作異常正如我在上面顯示的多行。現在這是我的問題。任何人都可以告訴我如何在文本文件中記錄第一個和最後一個日期?

+0

它應該是不'sr.ReadLine(;' –

+1

你爲什麼不使用的FileInfo的創建時間和LastWriteTime? http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx –

+2

目前,您並不是逐行處理文件,而只是閱讀整個文件。在我看來,你應該一行一行地閱讀,檢查它是否符合特定的模式(也許是一個正則表達式),如果是這樣,在子串上使用一些DateTime.ParseExact來獲取日期......? –

回答

1

下面是一個例子,如何解析這個:

//init datetime list for log entries 
List<DateTime> logDates = new List<DateTime>(); 

//Define regex string 
string pattern = @"(?<logDate>(\d){4}-(\d){2}-(\d){2}\s(\d){2}:(\d){2}:(\d){2})"; 
Regex reg = new Regex(pattern); 

//read log content 
string logContent = File.ReadAllText("test.log"); 

//run regex 
MatchCollection matches = reg.Matches(logContent); 


//iterate over matches 
foreach (Match m in matches) 
{ 
    DateTime logTime = DateTime.Parse(m.Groups["logDate"].Value); 
    logDates.Add(logTime); 
} 

//show first and last entry 
Console.WriteLine("First: " + logDates.First()); 
Console.WriteLine("Last: " + logDates.Last()); 

我已經刪除了毫秒逗號只是爲了更容易地解析。

問候弗洛裏安

+0

我用你的代碼和它現在的工作。非常感謝你爲你的漂亮的代碼:-) – SuryaKavitha

+1

@SuryaKavitha:只是一個旁註,你可以結合cansik的正則表達式和我的'DateTime.TryParseExact'。我認爲這將是最穩健的方法,並解析millis。但是,那麼你需要修改正則表達式來獲得毫秒。 –

+0

你能解釋我說的是什麼嗎? – SuryaKavitha

5

下面是使用LINQ和DateTime.TryParseExact的方法:)

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 
} 
+0

我不得不爲此投票。它解決了我面臨的問題,直到在每一行的開始處得到最早和最新的日期! –