0

「GSA検索」で「経過時間」の合計を計算したいのですが、食い違いがあります。形式が「経過時間:97ms」の場合もあれば、「経過時間:97ms」の場合もあります。どうすれば両方のシナリオをカバーできますか?

以下は私のログファイル形式です:

WX検索=サーバー:nomos-scanner.corp.comユーザー:vibsharmappGUID:wx経過時間:975ms SaveSearchID:361
WX検索=サーバー:nomos-scanner.corp.comユーザー:vibsharmappGUID:wx経過時間:875ms SaveSearchID:361
GSA検索=サーバー:nomos-scanner.corp.comユーザー:gulanandappGUID:wx経過時間:890msSaveSearchID:361
GSA検索=サーバー:nomos-scanner.corp.comユーザー:vibsharmappGUID:wx経過時間:887msSaveSearchID:361
GSA検索=サーバー:nomos-scanner.corp.comユーザー:gulanand appGUID:wx経過時間:875.5ms SaveSearchID:361
GSA検索=サーバー:nomos-scanner.corp.comユーザー:vibsharmappGUID:wx経過時間:877.6msSaveSearchID:361

私のコード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Linq.Expressions;

namespace ConsoleApplication5
{
    class Program
    {
        public static void Main(string[] args)
        {
            string searchKeyword = "WX GSA Search";
            string fileName = @"C:\Users\karan\Desktop\Sample log file.txt";
            string[] textLines = File.ReadAllLines(fileName);

            List<string> results = new List<string>();

            foreach (string line in textLines)
            {
                if (line.Contains(searchKeyword))
                {
                    results.Add(line);
                }
            }
            var elapsedTime = results.SelectMany(line => line.ToLower().Split(' '))
            .Where(line => line.StartsWith("time"))
            .Select(timeLine => decimal.Parse(timeLine.Split(':')[1].Replace("ms", String.Empty)))
            .Average(time => time);
            Console.WriteLine(elapsedTime);
            // keep screen from going away
            // when run from VS.NET
            Console.ReadLine();
            }  
    }  
}
4

2 に答える 2

0
        string x = @"Elapsed Time: 97ms";
        int startIndex = x.LastIndexOf("Elapsed Time");
        int endIndex = x.LastIndexOf("ms");
        //Here there might be a problem, you might need to change to endIndex - startIndex +1
        string valueSubString = x.Substring(startIndex, endIndex - startIndex);
        decimal value = decimal.Parse(valueSubString.Replace(':').Trim());
于 2013-03-04T07:45:08.857 に答える
0

次のように、文字列の割り当てを減らすと、速度を上げることができます。

(理想的には、有限状態マシン パーサーを完全に使用しますが、行ごとに読み取ることも可能です):

Decimal totalMs = 0;
Int32 totalRecords = 0;

using(StringReader rdr = new StreamReader(fileName, Encoding.UTF8)) {

    String line;
    while( (line = rdr.ReadLine()) != null ) {

        if( line.IndexOf("GSA Search", StringComparison.OrdinalIgnoreCase ) != 0 ) continue;

        Int32 idxStart = line.IndexOf("Elapsed time:", StringComparison.OrdinalIgnoreCase ) + "Elapsed time:".Length;
        Int32 idxEnd   = line.IndexOf("ms", idxStart, StringComparison.OrdinalIgnoreCase );

        Decimal lineMs = Decimal.Parse( line.Substring( idxStart, idxEnd - idxStart ) );
        totalMs += lineMs;
        totalRecords++;
    }
}
Decimal average = totalMs / totalRecords;

空白を使用できるため、呼び出し.Trimは不要ですが、より堅牢にしたい場合は、代わりに使用することを検討することをお勧めします。Decimal.ParseDecimal.TryParse

于 2013-03-04T07:49:42.243 に答える