2017-07-19 7 views
-2

私はこのような情報を含むログファイルを解析しようとしています:解析ログファイル - C#または任意の他の

2015-03-08 10:30:01  /user849/connect 
2015-03-08 10:30:01  /user262/open-level2-price 
2015-03-08 10:30:01  /user839/open-detailed-quotes 
2015-03-08 10:30:02  /user145/add-technical-drawing 
2015-03-08 10:30:02  /user108/connect 
2015-03-08 10:30:03  /user850/filter-changed 
2015-03-08 10:30:03  /user818/open-level2-price 
2015-03-08 10:30:03  /user841/column-width 
2015-03-08 10:30:03  /user850/filter-changed 
2015-03-08 10:30:04  /user850/connect 
2015-03-08 10:30:04  /user420/duration 
2015-03-08 10:30:04  /user851/filter-changed 
2015-03-08 10:30:04  /user217/duration 
2015-03-08 10:30:05  /user82/update-column-properties 
2015-03-08 10:30:05  /user809/open-level2-price 
2015-03-08 10:30:05  /user382/add-technical-drawing 
2015-03-08 10:30:06  /user851/connect 
2015-03-08 10:30:07  /user350/add-technical-drawing 
2015-03-08 10:30:09  /user849/filter-changed 
2015-03-08 10:30:09  /user842/sort 
2015-03-08 10:30:09  /user849/open-market-watch 
2015-03-08 10:30:10  /user429/interval 
2015-03-08 10:30:10  /user218/change-columns 
2015-03-08 10:30:11  /user749/connect 
2015-03-08 10:30:13  /user759/open-detailed-quotes 
2015-03-08 10:30:14  /user753/connect 
2015-03-08 10:30:14  /user377/connect 

私は3つの最も使用される操作を見つけようとし、そしてその割合よ、何Iファイルを読み込んだり、正規表現で行を解析したり、データテーブルにデータを書き込んだりしてそのデータテーブルを処理したりしていましたが、できませんでした。

私は何をやるべきか、どこから始めたいのか、あるいはいくつかのコードサンプル(できればC#)をアドバイスできますか?

ありがとうございます!


編集:

まあ、(私は成功し、今それをやった)私が試したものについては、ここですが、私のコード

string filePath = @"6458.log"; 

try 
{ 
    DataTable logLines = new DataTable("LogLines"); 
    //logLines.Columns.Add(new DataColumn("DateTime", System.Type.GetType("System.DateTime"))); 
    logLines.Columns.Add(new DataColumn("User", typeof(string))); 
    logLines.Columns.Add(new DataColumn("Operation", typeof(string))); 

    string[] lines = System.IO.File.ReadAllLines(filePath); 

    foreach (string line in lines) 
    { 
     var cols = line.Split(new char[] { ' ', '/' }, StringSplitOptions.RemoveEmptyEntries); 

     DataRow dr = logLines.NewRow(); 

     //dr["DateTime"] = cols[0] + " " + cols[1]; 
     dr["User"] = cols[2]; 
     dr["Operation"] = cols[3]; 

     logLines.Rows.Add(dr); 
    } 

    var query = from row in logLines.AsEnumerable() 
       group row by row.Field<string>("Operation") into operations 
       orderby operations.Count() descending 
       select new 
       { 
        Name = operations.Key, 
        CountOfClients = operations.Count() 
       }; 
} 
catch (Exception ex) 
{ 
    throw(ex) ; 
} 

であるためのコードを使用してヒントをバックアップしてくださいさらなる説明!

おかげで再び

+5

'私はそれを行うことができませんでした。コードを見ることはできますか? – vasek

+2

'DataTable'は' Dictionary 'のように簡単で、logtextをキーに、出現を値として保存するので、これは使わないことをお勧めします。 –

+0

vasekの質問...あなたは何を試しましたか?ファイルの読み込み、各行の解析、データの分析に助けが必要ですか? –

答えて

0

あなたはListへのファイルの行を追加することができ、あなたが

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<data> logs = new List<data>(); 
      var path=Path.Combine([email protected]"\file.txt"); 
      using (StreamReader sr = new StreamReader(path)) 
      { 
       string line; 
       while((line = sr.ReadLine()) != null) 
       { 

        var log = Regex.Split(line, "  "); 
        logs.Add(new data { LogDate=DateTime.Parse(log[0]),Operation=log[1]}); 
       } 
      } 

      // here you can use linq to get the data you want from logs list 



      // end of main 
     } 


     public class data 
     { 
      public DateTime LogDate { get; set; } 
      public string Operation { get; set; } 
     } 
     // end of class 
    } 


} 

file.txtをしたいデータを取得するためにLINQを使用することで、

0
を読みたいログファイルです

アクションと呼び出し回数を取得する場合は、このコードを使用できます。

Dictionary<string, int> items = new Dictionary<string, int>(); 

foreach(string line in lines) 
{ 
    var cols = line.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
    var operation = cols[2].Trim(); 

    if(items.Keys.Any(x => x.Equals(operation))) 
    { 
     items[operation]++; 
    } 
    else 
    { 
     items[operation] = 1; 
    } 
} 

この後、アクションがキーであり、コールの数が値である辞書があります。

構文解析をもう少しエラーに強くしたい場合は、論理を全く変更せずにこの部分を変更することができます。

すべてのアクションの数を取得する場合は、これを使用します。

var actionCount = items.Sum(x => x.Value); 

たとえば、「接続」アクションの割合を取得する場合は、これを使用できます。

var percentage = 100.0/actionCount * items["connect"]; 

しかし、この行の辞書に「接続」エントリがないかどうかを確認する必要があります。あなたが使用できるキーが存在するかどうかを確認することができます

items.ContainsKey("connect"); 
関連する問題