2012-04-25 26 views
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"などで指定します。次に、読み込まれているすべてのファイルの合計を計算し、Monthly Statisticsファイルを作成します。私は現在合計を得ていますが、私はそれが私が渡しているヘッダーと関係があると思うし、その行をスキップするように指示する方法がわかりません。事前に

おかげで

EDIT

はここ

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

など、もともとディレクトリを読み、私のプロセッサであり、プロセッサがためにを検索するための適切なディレクトリを検索しますファイルを取得します。現在の日付を使用し、先月に検索します。ヘッダをスキップ

答えて

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前)最初の3行を持って次のようにあなたのためのポイントがあります

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

。 –

+0

母、私を今ストーカーしないでください! ;-) – yamen

+0

おかげさまで助けてくれてありがとうございました。しかし、C#の初心者ですから、これがコード内のどこにあるのか不思議です。 –

関連する問題