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

これは、約1ギガのログファイルの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

メソッドは、ctIndex を line.SubString() に設定した後、-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 に答える