3

我已经搜索但没有找到我的答案。免责声明:我是 C# 的新手,但我的任务是创建以下程序:从现有日志文件中读取,按选项卡解析它们,将结果限制为特定状态(处理电子邮件),按部门分组(即投资银行),然后按部门计算电子邮件转换量的统计数据,并打印到新的日志文件。

在提出问题之前,想先介绍一下程序本身的背景。我目前正处于我想按部门分组的地步,但不知道该怎么做。

编辑:原始数据:

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

我现在要做的是按“投资银行”、“国库”等分组,然后能够计算总数。

最终的日志文件将如下所示:

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

2 回答 2

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));

如果不弄乱匿名类而是使用数组,它可能会更短(虽然不太清楚)。如果您对此类代码感兴趣,请告诉我。

于 2012-04-04T14:28:14.840 回答
0

然后我会建立一个类来处理这个。

就像是

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

然后你可以把它们封装起来

List<xxx> Divisions;

不确定这是否是最佳的,但它会起作用。

于 2012-04-04T14:03:33.497 回答