0

すべての行が入ってtextLines1おり、これらすべての行の平均経過時間を計算したいと考えています。これについて正規表現を試しました。しかし、それは私に間違った計算を与えています。

ログファイル形式:

INFO:  WX ADVSearch = Server:testserver Entity:BUG User:acucu Elapsed Time:274ms 
INFO:  WX ADVSearch = Server:testserver Entity:BUG User:acucu Elapsed Time:274ms 

私が試したコードは次のとおりです。

List<string> textLines1 = new List<string>(users);
string x = string.Join(",", textLines1);
Regex regex = new Regex(@"Elapsed Time:\s*(?<value>\d+\.?\d*)\s*ms");
Match match = regex.Match(x);
double totalTime = 0;
int count = 0;

foreach (string line in textLines1)
{
    if (match.Captures.Count > 0)
    {
        try
        {
            count++;
            double time = Double.Parse(match.Groups["value"].Value);
            totalTime += time;
        }
        catch (Exception)
        {
            // no number
        }
    }
}

double average = totalTime / count;
Console.WriteLine("ADVAverage=" + average);
4

3 に答える 3

1
private static void CalculateTotalTime()
{
    Regex pattern = new Regex(@"INFO:.+Elapsed Time:(?<milliseconds>\d+(\.\d{1,2})?)ms");

    double totalMilliseconds = (from Match match in pattern.Matches(input)
                                let milliseconds = double.Parse(match.Groups["milliseconds"].Value)
                                select milliseconds).Sum();

    TimeSpan elapsed = TimeSpan.FromMilliseconds(totalMilliseconds);
    Console.WriteLine("{0:D2}:{1:D2}:{2:D2}:{3:D3}", elapsed.Hours, elapsed.Minutes, elapsed.Seconds, elapsed.Milliseconds);
}


private const string input =
    "INFO: WX ADVSearch = Server:yukon.corp.adobe.com Entity:BUG User:acucu Elapsed Time:274ms\n" +
    "INFO: WX ADVSearch = Server:yukon.corp.adobe.com Entity:BUG User:acucu Elapsed Time:27.5ms\n" +
    "INFO: WX ADVSearch = Server:yukon.corp.adobe.com Entity:BUG User:acucu Elapsed Time:500.55ms";

与えられたテスト データを使用して上記の方法を記述してテストしたところ、計算は正確です。

于 2013-03-12T07:56:36.277 に答える
0

あなたのコードにはいくつかのエラーがありました (私の意見では):

  1. string.Joinを受け取り、string[]あなたは を渡していましたList<string>
  2. 本当に何もする必要はありませんstring.Join。代わりに、各行を繰り返し処理し、各行で一致をキャプチャします。

以下のコードを参照してください。

//I don't think you have to do this. Instead, you can iterate through `users`
string[] textLines1 = new List<string>(users).ToArray();
double totalTime = 0;
int count = 0;

//For each line
foreach (string line in textLines1) {
    //Here we match against this line
    var m = Regex.Match(line, @"Elapsed Time:\s*(?<value>\d+\.?\d*)\s*ms");
    //If it matched...
    if (m.Success) {
        try
        {
            count++;
            double time = Double.Parse(m.Groups["value"].Value);
            totalTime += time;
        }

        catch (Exception)
        {
            // no number
        }
    }
}

double average = totalTime / count;
Console.WriteLine("ADVAverage=" + average);

以下は出力です。

ADVAverage=274

于 2013-03-12T07:57:38.963 に答える
-1

あなたの正規表現は十分に正しくないと思います。次のように一致させることも検討してください。

"Elapsed Time:.*ms"

数字を取得するには、最初の 13 文字と最後の 2 文字を切り捨てることができます。次に、行ごとに、Double.TryParse(自分で特別な処理を行っていないので、TryParseメソッドにそれをさせて、自分のコードをきれいに保つことができます)を使用して、関心のある番号を取得できます。

正規表現をチェックして、 http://regexpal.com/などの Web サイトで適切に一致しているかどうかを確認できます。

于 2013-03-12T07:45:48.687 に答える