0

我正在解析一些日志文件以生成报告,但String.IndexOf()在几行中得到了奇怪的结果。在这里使用 C#。用一些代码最容易解释。

String line = "Jun 29 14:34:19 localhost axis2_http_server: CEF:0|AOPTIX|IRIS|4.1.0.1664.2839|AD214030000301-2610017|114|SDK_ACCESS|4|time=1340980459 comp=10 compinfo=CAPTURE from=8 result=0 user=Admin thread=1305:1962 msg=ation=0.00, faceColor=11.49 HR Face is ICAO compliant, inter-pupil distance=140.00. No match found on LEFT eye (database is empty). LEFT_uid=-1, blacklist=0 No match found on RIGHT eye (database is empty). RIGHT_uid=-1, blacklist=0 CAPTURE successfully completed - SOAP response sent. ";
int ctIndex = line.IndexOf("CaptureTime=");
return ctIndex;

预期:-1
实际:11

这只发生在大约一演出的日志文件中的 2 行。

实际实现的方法

private TimeSpan parseDuration(string line)
{
    int ctIndex = line.IndexOf("CaptureTime=");
    ctIndex = ctIndex + "CaptureTime=".Length;
    int endIndex = line.IndexOf(" ", ctIndex);
    string sDuration = line.Substring(ctIndex, endIndex - ctIndex);
    long duration;
    if (!long.TryParse(sDuration, out duration))
    {
        Console.WriteLine("Error Parsing Duration");
        return TimeSpan.Zero;
    }
    duration *= 1000;
    TimeSpan tsDuration = new TimeSpan(duration*1000);
    return tsDuration;
}

换行代码

try{
    StreamReader sr = new StreamReader(FilePath);
    string line = sr.ReadLine();
    while(line != null)
    {
         TimeSpan ts = parseDuration(line);
         line = sr.ReadLine();
    }
catch(Exception ex){}
finally{sr.close();}
4

2 回答 2

6

您的方法在将其设置为 line.SubString() 后不检查 ctIndex 是否等于 -1。然后将“CaptureTime=”的长度添加到 ctIndex,然后执行子字符串。

由于这些原因,我怀疑您的代码在当前状态下对于不包含 CaptureTime= 值的日志消息将无法正常工作。这种功能性行为是有意的吗?

于 2012-11-01T19:31:47.923 回答
4

您没有处理CaptureTime=在字符串中找不到的情况。

  • 你有ctIndex= -1,然后你加上 12(的长度CaptureTime=)。这给了你11。
  • 然后,您会找到之后的第一个空格,即时间戳和“localhost”之间的空格。那是在第15位。
  • 然后,您得到从 11 到 15 的子字符串,即“4:19”。
  • 最后,您尝试将其解析为 long,但显然不是。

您需要实际检查是否ctIndex == -1,然后正确处理。

于 2012-11-01T19:32:27.067 回答