2

これは、以前に尋ねたのと同様の質問ですが、複数のファイルを取得し、それらのファイルの合計を計算しているという点が異なります。特定のディレクトリからすべてのファイルを読み取っているところまで来ていますが、何らかの理由で正しくグループ化されていません。

これが私が持っているコードです:

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  

だから私がやろうとしているのは、「Corporate」、「Energy」などでグループ化することです。次に、読み取られているすべてのファイルの合計を計算して、月次統計ファイルを作成します。現在、合計を取得していますが、渡したヘッダーと関係があると思います。その行をスキップするように指示する方法がわかりません。

前もって感謝します

編集

これが私のプロセッサで、元々ディレクトリなどを読み取ります。

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

プロセッサは、ファイルを取得するために検索する適切なディレクトリを見つけます。現在の日付を使用して、先月を検索します。

4

1 に答える 1

5

ヘッダーをスキップするのは簡単です。

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

ただし、一度に1つのファイルを読み取っているように見えますが、すべてのファイルを読み取ってから統計を計算したい場合はどうでしょうか。

最初はどうですか:

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に最初の3行(の前GroupBy)があります。

    public void CalculateMonthlyStatistics(string path)
    {
        var statistics = ReadLinesInDirectory(path)
                         // .GroupBy etc...
于 2012-04-25T21:31:12.110 に答える