-2

我有一个像这样的大日志文件:

    2020-03-25 13:15:41 App initialized.
    2020-03-25 13:18:22.477 ERROR Exception from api  blah blah blah blah:  NOT FOUND
            at element(bl:97) ~[classes/:na]
            at blah blah blah blah(bm:997) ~[classes/:na]   
            at blah blah blah blah(yq:5) ~[classes/:na]
            at blah blah blah blah(Native Method) ~[na:1.4.0_111]   
    2020-03-25 13:18:22.477 ERROR blah blah - Exception from api  blah blah blah blah: STATUS MONITOR   
            at element(bl:97) ~[classes/:na]
            at blah blah blah blah(bm:997) ~[classes/:na]   
            at blah blah blah blah(yq:5) ~[classes/:na]
            at blah blah blah blah(Native Method) ~[na:1.4.0_111]  

并且需要编写一个函数来从错误中返回时间戳和文本。

2020-03-25 13:18:22.477 

作为键,和

ERROR Exception from api  blah blah blah blah:  NOT FOUND
            at element(bl:97) ~[classes/:na]2020-03-25 13:15:41  
            at blah blah blah blah(bm:997) ~[classes/:na]   
            at blah blah blah blah(yq:5) ~[classes/:na]
            at blah blah blah blah(Native Method) ~[na:1.4.0_111]

作为价值观

我正在使用 aDictionary<DateTime, string>来保存数据,并使用 Stringbuilder 来构建错误的每一行。但我无法弄清楚如何在不影响我尝试构建的数据的情况下正确循环它,因为它每行都会重置。

                foreach (var line in File.ReadLines(fileName))
                {
                    bool isTimeStamp = false;
                    do
                    {
                        sb = new StringBuilder();
                        timeStamp = new DateTime();
                        try
                        {
                            timeStamp = DateTime.Parse(line.Substring(0, 24));
                            isTimeStamp = true;
                        }
                        catch
                        {
                            sb.AppendLine(line);
                            break;
                        }
                    }
                    while (!isTimeStamp);

                    logs.Add(timeStamp, sb.ToString());
                }

任何指针或提示将不胜感激。

4

1 回答 1

-1

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication3
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            string pattern = @"^(?'date'[^\s]+\s[^\s]+)\s+(?'error'.*)";
            Dictionary<DateTime, List<string>> dict = new Dictionary<DateTime,List<string>>();
            StreamReader reader = new StreamReader(FILENAME);
            string line = "";
            List<string> messages = null;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    if (line.StartsWith("at"))
                    {
                        messages.Add(line.Trim());
                    }
                    else
                    {
                        Match match = Regex.Match(line, pattern);
                        string dateStr = match.Groups["date"].Value;
                        DateTime date = DateTime.Parse(dateStr);
                        string message = match.Groups["error"].Value.Trim();
                        messages = new List<string>();
                        messages.Add(message);
                        dict.Add(date, messages);
                    }
                }
            }

        }
    }
}
于 2020-03-27T15:56:37.567 回答