2014-10-17 3 views
2

임 .log 파일을 구문 분석을 시도하고 다음과 같습니다 그것의 일부를 입수했습니다 :LINEX에서 lineY C 번호를 읽는 방법

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 :)를 포함하는 줄에서 (로거에 대한 업데이트 된 타임 스탬프)를 포함하는 줄을 읽는 것을 알고 있습니까?

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

} 

덕분에 어떤 도움을 당신이 제공 :

수있을를

이 내가 얻을 수 있었던 얼마나 멀리입니다

답변

1

당신은 내가 SkipWhile과 TakeWhile 새로운 오늘 뭔가를 배웠

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

죄송합니다. 끝에 GetConventionalDataTask를 포함시키고 싶었지만 정규식 패턴은 'Match m = Regex.Match (input, @ "GetConventionalDataTask \ s- \ s (. *) \ s이어야합니다. - 로거의 \ sUpdated 타임 스탬프 ", RegexOptions.Singleline); –

1

이 경우 LINQ의 SkipWhileTakeWhile 방법을 사용할 수 있습니다.

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

위의 두 마커 사이의 로그에서 줄을 나타내는 문자열 목록을 생성합니다.

+0

정규 표현식을 사용하여 2 GetConventionalDataTask 사이에있는 텍스트를 얻을 수 있지만 완전히 첫 번째 줄을 얻고, 완전히 마지막 줄을 건너 뛸 것이다 OP가 원하는 것이 아닙니다. – Tyress