按拆分后的值对结果进行分组
本文关键字:结果 拆分 | 更新日期: 2023-09-27 18:30:03
我已经搜索过了,但没有找到答案。免责声明:我是C#的新手,但我有一项任务要创建以下程序:从现有的日志文件中读取,按Tab分析,将结果限制在特定状态(处理电子邮件),按部门分组(即投资银行),然后按部门计算电子邮件转换量的统计数据,并打印到新的日志文件。
想在提问之前先介绍一下节目本身的背景。我目前正处于想按部门分组的阶段,但不知道如何做到这一点。
编辑:原始数据:
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
以下代码可以满足您的需要:
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));
如果不使用匿名类而是使用数组,它可能会更短(尽管不太清楚)。如果你对这样的代码感兴趣,请告诉我。
我会构建一个类来处理这个问题。
类似的东西
public class xxxx
{
Public string Division {get;set}
Public Dictionary<string,int> something{get;set;}
}
然后你可以用封装它们
List<xxx> Divisions;
不确定这是否是最佳的,但它会起作用。