这是我之前提出的一个类似的问题,不同之处在于我正在处理多个文件并计算这些文件的总和。我知道我正在读取特定目录中的所有文件,但出于某种原因它没有正确分组。
以下是我的代码:
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);
}
}
处理器找到要搜索的正确目录,以便从中获取文件。它使用当前日期,并在上个月找到。
答案 0 :(得分:5)
跳过标题非常简单:
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...