1

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

このコードは、例外行が単一の場合に最初の日付と最終更新日を取得するために記述しますが、上記のように複数の行で例外に対して機能しません。これは私の問題です。このテキスト ファイルの最初と最後の日付を取得する方法を誰か教えてもらえますか?

4

2 に答える 2

8

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
}
于 2012-06-05T07:25:44.237 に答える
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());

解析しやすくするために、ミリ秒のコンマを削除しました。

よろしくフロリアン

于 2012-06-05T06:50:42.607 に答える