【问题标题】:How to read from lineX to lineY C#如何从 lineX 读取到 lineY C#
【发布时间】:2014-12-12 21:57:33
【问题描述】:

我正在尝试解析一个 .log 文件并得到了如下所示的一部分:

2014-03-31 13:20:42,046 DEBUG 4B414D00000001184917.GetConventionalDataTask - GetCompressedLogResponse received: GetCompressedLogResponse: Id = GetCompressedLog, LoggerType = LoadProfileLogger, NumberOfRegisters = 5, NewLogId = 3281, Info = HeadOfLoggerIncluded

 LogID          RealTimeClock Logger_Status Logger_Data_Quality EnergyA14 EnergyA23 
          [KamDateTimeStatus]      [NoUnit]            [NoUnit]     [kWh]     [kWh] 
------ ---------------------- ------------- ------------------- --------- --------- 
  3264 02 2014-03-31T08:00:00          0000            00000000      0.17      0.00 
  3265 02 2014-03-31T08:15:00          0000            00000000      0.17      0.00 
  3266 02 2014-03-31T08:30:00          0000            00000000      0.17      0.00 
  3267 02 2014-03-31T08:45:00          0000            00000000      0.17      0.00  

2014-03-31 13:20:42,049 DEBUG 4B414D00000001184917.GetConventionalDataTask - Updated timestamp for logger LoadProfileLogger with time 31-03-2014 12:20:42

如何获取 2 个 GetConventionalDataTask 行之间的行,以便程序知道从包含 (GetCompressedLogResponse received:) 的行开始读取包含 (Updated timestamp for logger) 的行?

这是我能走多远:

public static bool IsLoggerStart(string text)
    {
        return text.Contains("GetCompressedLogResponse received:");
    }
    public static bool IsLoggerEnd(string text)
    {
        return text.Contains("Updated timestamp for logger");
    }
    public static string GetLoggerType(string text)
    {
        return GetSubStrings(text, "LoggerType = ", ", ").FirstOrDefault();
    }
    public static string GetNumberOfRegisters(string text)
    {
        return GetSubStrings(text, "NumberOfRegisters = ", ", ").FirstOrDefault();
    }
    public static string GetNewLogId(string text)
    {
        return GetSubStrings(text, "NewLogId = ", ", ").FirstOrDefault();
    }

还有我创建的对象:

class CompressedLogResponse
{
    public LoggerAnnounce LoggerAnnounce { get; set; }
    public List<int> LogID { get; set; }
    public List<DateTime> RealTimeClock { get; set; }
    public List<int> LoggerStatus { get; set; }
    public List<int> LoggerDataQuality { get; set; }
    public List<double> EnergyA14 { get; set; }
    public List<double> EnergyA23 { get; set; }
}
class LoggerAnnounce
{
    public string LoggerType { get; set; }
    public int NumberOfRegisters { get; set; }
    public int NewLogId { get; set; }

}

感谢您提供的任何帮助:)

【问题讨论】:

    标签: c# substring text-parsing


    【解决方案1】:

    您可以为此使用 LINQ 的 SkipWhileTakeWhile 方法:

    var between = File.ReadLines("LogFile.log")
        .SkipWhile(s => !s.Contains("GetConventionalDataTask"))
        .TakeWhile(s => !s.Contains("Updated timestamp for logger"))
        .ToList();
    

    上面将生成一个字符串列表,表示两个标记之间的日志中的行。

    【讨论】:

    • 我今天用 SkipWhile 和 TakeWhile 学到了一些新东西,但这将完全获得第一行,并完全跳过最后一行,这不是 OP 想要的
    【解决方案2】:

    您可以使用正则表达式获取 2 GetConventionalDataTask 之间的文本

    string input = File.ReadAllText("C:/log.txt");
    Match m = Regex.Match(input, @"GetConventionalDataTask\s-\s(.*).GetConventionalDataTask", RegexOptions.Singleline);
    Console.WriteLine(m.Groups[1]);
    

    【讨论】:

    • 对不起,我错过了你希望 GetConventionalDataTask 包含在最后,那么正则表达式模式必须是 Match m = Regex.Match(input, @"GetConventionalDataTask\s-\s(.*)\s-\sUpdated timestamp for logger", RegexOptions.Singleline);
    猜你喜欢
    • 2020-10-24
    • 2015-07-05
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多