C# - 计算多个文件的总统计信息
本文关键字:总统 统计 信息 文件 计算 | 更新日期: 2023-09-27 18:32:26
这是我
之前问的一个类似的问题,除了不同的是我正在获取多个文件并计算这些文件的总和。我已经到了从特定目录中读取所有文件的地步,但由于某种原因它没有正确分组。
这是我的代码:
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
所以我要做的是按"公司"、"能源"等分组。然后计算正在读取的所有文件的总数,以创建每月统计信息文件。我目前正在获得总数,但是我认为这与我传入的标题有关,我不确定如何告诉它跳过该行。
提前致谢
编辑
这是我的处理器,它最初读取目录等。
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...