2012-04-04 72 views
3

我已經搜索過,但還沒有找到我的答案。免責聲明:我是C#的新手,但我有一項工作要創建以下程序:從現有日誌文件讀取,按Tab分析它們,將結果限制爲特定狀態(Process E-mail),按分組分組即投資銀行),然後按部門計算電子郵件轉換量的統計數據,並打印到新的日誌文件中。按分組計算後的分組結果

希望在提問之前給出一點關於程序本身的背景知識。我目前正處於我想按部門分組,並且不知道如何去做的地步。

編輯:原始數據:

Status   Division  Time   Run Time Zip Files Conversions Returned Files Total E-Mails 
Process E-mail Investment Bank 12:00 AM 42.8596599 1    0    1    1 
End Processing     12:05 AM 44.0945784 0    0    0    0 
Process E-mail Investment Bank 12:10 AM 42.7193253 2    1    0    1 
Process E-mail Treasury   12:15 AM 4.6563394 1    0    2    2 

這裏是我到這一點代碼:

static void Main() 
{ 
    { 

     List<string> list = new List<string>(); 
     using (StreamReader reader = new StreamReader(Settings.LogPath + "2012-3-10.log")) 
     { 
      string line; 
      int i = 0; 
      while ((line = reader.ReadLine()) != null) 
      { 
       list.Add(line); 
       i++; 

       string[] split = line.Split('\t'); 

       string processing = split[0]; 

        if(processing.StartsWith("Process")) 
        { 
         string division = split[1]; 
         int zipFiles; 
         int.TryParse(split[4], out zipFiles); 
         int conversions; 
         int.TryParse(split[5], out conversions); 
         int returnedFiles; 
         int.TryParse(split[5], out returnedFiles); 
         int totalEmails; 
         int.TryParse(split[5], out totalEmails); 

所以我有計劃的地步,它會吐出的東西這樣的控制檯:

Investment Bank 
1 
0 
1 
1 

Treasury 
1 
0 
2 
2 

Investment Bank 
2 
1 
0 
1 

我現在想要做的,是由「投資銀行」,「財政部」,等組c然後能夠計算總數。

最後的日誌文件看起來像這樣:

Division   Zip Files Conversions Returned Files Total E-mails 
Investment Bank 3   1    1    2 
Treasury   1   0    2    2 
+0

什麼是您的原始數據? – 2012-04-04 13:57:22

+0

爲什麼不只是在流讀取器上使用開關盒來根據您的標準分離數據(無論是指定Treasury vs. Investment Bank等)。我個人可能會捕獲每個部門作爲自己的對象,並將其包裝在父對象中以供引用。 IE Class Division有一個名單和List CBRRacer 2012-04-04 14:18:46

+0

@Johnny_D - 添加了原始數據集,介意你這只是一個非常小的日誌文件視圖,還有更多的部門等 – 2012-04-04 14:27:16

回答

1

下面的代碼做你所需要的:

string filename = @"D:\myfile.log"; 
var statistics = File.ReadLines(filename) 
    .Where(line => line.StartsWith("Process")) 
    .Select(line => line.Split('\t')) 
    .GroupBy(items => items[1]) 
    .Select(g => 
      new 
       { 
        Division = g.Key, 
        ZipFiles = g.Sum(i => Int32.Parse(i[2])), 
        Conversions = g.Sum(i => Int32.Parse(i[3])), 
        ReturnedFiles = g.Sum(i => Int32.Parse(i[4])), 
        TotalEmails = g.Sum(i => Int32.Parse(i[5])) 
       }); 

Console.Out.WriteLine("Division\tZip Files\tConversions\tReturned Files\tTotal E-mails"); 
statistics 
    .ToList() 
    .ForEach(d => Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", 
      d.Division, 
      d.ZipFiles, 
      d.Conversions, 
      d.ReturnedFiles, 
      d.TotalEmails)); 

這可能是更短(雖然不太清楚),如果不能亂用匿名類,但使用數組來代替。讓我知道你是否對這樣的代碼感興趣。

+0

非常感謝你,這完全是我在找的東西。現在要了解它的邏輯,並試圖理解它背後的邏輯;) – 2012-04-04 14:41:46

+0

不,這很好,就像我早些時候說的那樣,我的老闆只是把我扔在這個項目上,所以我正在學習C#和學習編程。 。 – 2012-04-04 14:47:44

+0

我已經使用了C#(儘管沒有那麼多LINQ)現在已經有一段時間了。我不知道GroupBy可以如此強大地使用。這是權力的一個很好的例子。 – 2012-04-04 15:38:10

0

我將建立一個類然後處理此。

public class xxxx 
{ 
    Public string Division {get;set} 
    Public Dictionary<string,int> something{get;set;} 
} 

然後你可以只封裝他們

List<xxx> Divisions; 

不知道這是否是最佳的,但它的工作。

+0

謝謝你的回覆,讓我再看看這個......再一次,我對C#非常陌生,所以我不得不做一些研究如何完成這件事。你可以提供一個使用我的數據而不是xxx和某些東西等的例子嗎?這將非常有幫助。謝謝! – 2012-04-04 14:30:05