Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从lineX读取到lineY C#_C#_Substring_Text Parsing - Fatal编程技术网

如何从lineX读取到lineY C#

如何从lineX读取到lineY C#,c#,substring,text-parsing,C#,Substring,Text Parsing,我正在尝试分析一个.log文件,其中的一部分如下所示: 2014-03-31 13:20:42,046 DEBUG 4B414D00000001184917.GetConventionalDataTask - GetCompressedLogResponse received: GetCompressedLogResponse: Id = GetCompressedLog, LoggerType = LoadProfileLogger, NumberOfRegisters = 5, NewLog

我正在尝试分析一个.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:)的行读取到包含(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; }

}
类压缩日志响应
{
公共LoggerAnnounce LoggerAnnounce{get;set;}
公共列表LogID{get;set;}
公共列表实时时钟{get;set;}
公共列表日志状态{get;set;}
公共列表LoggerDataQuality{get;set;}
公共列表14{get;set;}
公共列表23{get;set;}
}
类对数盎司
{
公共字符串日志类型{get;set;}
公共int NumberOfRegisters{get;set;}
public int NewLogId{get;set;}
}
感谢您可能提供的任何帮助:)

您可以使用LINQ的和方法来实现此目的:

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

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

您可以使用正则表达式获取两个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的内容,那么regex模式必须是
Match m=regex.Match(输入,@“GetConventionalDataTask\s-\s(.*\s-\sUpdated timestamp for logger”,RegexOptions.Singleline)我今天通过SkipWhile和TakeWhile学到了一些新东西,但这将完全获得第一行,而完全跳过最后一行,这不是OP想要的