2012-06-05 4 views
1

Я пишу мои журналы в текстовом файле на моем локальном месте (C: \ Temp \ log.txt) с помощью C#. Текстовый файл хранится, как показано нижеКак читать даты в текстовом файле с помощью 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

почему вы не используете CreationTime 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'. Я предполагаю, что это был бы самый надежный подход и разбирал бы миллионы. Но тогда вам нужно изменить регулярное выражение, чтобы получить миллионы. –

+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

Мне пришлось проголосовать за это. Он решил проблему EXACT, с которой я столкнулся, вплоть до получения самых ранних и последних дат в начале каждой строки! –

Смежные вопросы