C# - 计算多个文件的总统计数据

标签 c# linq file parsing

这是我之前问过的类似问题,不同之处在于我正在获取多个文件并计算这些文件的总和。我已经可以从特定目录读取所有文件,但由于某种原因它无法正确分组。

这是我的代码:

public void CalculateMonthlyStatistics(string monthlyFiles)
        {
            string monthlyFileName = monthlyFiles + ".log";

            var statistics = File.ReadLines(monthlyFileName)

            .GroupBy(items => items[0])
            .Select(g =>
            new
            {

                Division = g.Key,
                ZipFiles = g.Sum(i => Convert.ToInt32(i[1])),
                Conversions = g.Sum(i => Convert.ToInt32(i[2])),
                ReturnedFiles = g.Sum(i => Convert.ToInt32(i[3])),
                TotalEmails = g.Sum(i => Convert.ToInt32(i[4]))
            });

            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));
               Console.Read();
               //.ForEach(d => Log.Open(tempFileName.TrimEnd(charsToTrim), d.Division, d.ZipFiles, d.Conversions, d.ReturnedFiles, d.TotalEmails));
        }
    }
}

我放入其中的日志文件如下所示:

 Division   Zip Files   Conversions Returned Files  Total E-Mails   
Corporate   0   5   0   5   
Energy  0   1   0   5   
Global Operations   0   3   0   3   
Oil & Gas   1   5   0   5   
Capital 5   18  0   12  

所以我想做的是按“公司”、“能源”等分组。然后计算正在读取的所有文件的总数,以创建每月统计文件。我目前正在获取总计,但是我认为它与我传入的 header 有关,并且我不确定如何告诉它跳过该行。

提前致谢

编辑

这是我的处理器,它最初读取目录等

public void ProcessMonthlyLogFiles()
    {
        DateTime currentTime = DateTime.Now;

        int month = currentTime.Month - 1;
        int year = currentTime.Year;

        string path = Path.GetDirectoryName(Settings.DailyPath + year + @"\" + month + @"\");

        foreach (string monthlyFileNames in Directory.GetFiles(path))
        {
            string monthlyFiles = path + @"\" + Path.GetFileNameWithoutExtension(monthlyFileNames);
            new MonthlyReader().CalculateMonthlyStatistics(monthlyFiles);
        }
    }

处理器找到正确的目录进行搜索,以便从中获取文件。它使用当前日期并查找上个月。

最佳答案

跳过标题很简单:

File.ReadLines(monthlyFileName).Skip(1).<rest of your chain>

但是,当您想要读取所有文件然后计算统计信息时,看起来好像您一次读取一个文件?

首先怎么样:

public IEnumerable<String> ReadLinesInDirectory(string path)
{
    return Directory.EnumerateFiles(path)
                    .SelectMany(f => 
                        File.ReadLines(f)
                        .AsEnumerable()
                        .Skip(1));
}

并替换 ReadLines这样(确保您指向正确的路径等)。


好的,这是完整的解释,但我认为您可能需要更多地学习 C#。首先,定义ReadLinesInDirectory我上面写的函数。

然后替换ProcessMonthlyLogFiles用这个代替:

public void ProcessMonthlyLogFiles()
{
    DateTime currentTime = DateTime.Now;

    int month = currentTime.Month - 1;
    int year = currentTime.Year;

    string path = Path.GetDirectoryName(Settings.DailyPath + year + @"\" + month + @"\");

    CalculateMonthlyStatistics(path);
}

CalculateMonthlyStatistics前三行(在 GroupBy 之前)如下:

    public void CalculateMonthlyStatistics(string path)
    {
        var statistics = ReadLinesInDirectory(path)
                         // .GroupBy etc...

关于C# - 计算多个文件的总统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323623/

相关文章:

c# - 验证日期时间是按月顺序的

c# - 如何使用 Lambda 或 Linq 语句执行以下操作?

c# - c# 使用 linq 在一个属性上过滤两个列表

file - 无法将驱动器映射到 Azure 文件存储共享且端口 445 打开

c# - ASP.NET MVC : Views using a model type that is loaded by MEF can't be found by the view engine

c# - 如何在wpf中延迟调用文本框的textchanged事件

java - 打开资源文件夹中存储的 PDF 文件会引发异常

c++ - 如何知道来自文本文件的输入是否是 C++ 中的有效数字

c# - 如何避免 DataView.ToTable() 中出现 KeyNotFoundException?

c# - 在windows c#中的进程中调用右键单击菜单