現在、ディレクトリから既存のログファイルを取得し、各ログファイルを実行して統計を計算し、そこから新しいファイルを作成するプログラムがあります。
ログファイルは現在、次のように名前が付けられています:2012-4-24.log
新しい統計ファイルを作成すると、同様のフォーマットが維持されますが、「-Stats」が追加されます:2012-4-24-Stats.log
これが私が解決しようとしていることです:私は毎年、そして月ごとに新しいディレクトリを作成したいので、次のようにフォルダ構造を持つことができます:
DailyStatistics-> 2012-> 4->2012-4-24-Stats.log
DailyStatistics-> 2012-> 5-> 2012-5-1-Stats.log
などなど
ファイル名から年と月を解析し、同じ年と月のすべてのファイルを実行してから、プログラムでループを実行して実際のファイルを作成する方法がわかりません。
これが私が持っているコードです...
class Processor
{
public void ProcessDailyLogFiles()
{
foreach (string fullFileName in Directory.GetFiles(Settings.LogPath))
{
string fileName = Path.GetFileNameWithoutExtension(fullFileName);
new DailyReader().CalculateStatistics(fileName);
new DailyReader().MoveLogFile(fileName);
}
}
}
次の授業...
public void CalculateStatistics(string filename)
{
string path = Settings.DailyPath;
if (!path.EndsWith(@"\"))
path = path + @"\";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string tempFileName = Settings.LogPath + filename + ".log";
string destFileName = path + filename + "-Stats.log";
var statistics = File.ReadLines(tempFileName)
.Where(line => line.StartsWith("Process"))
.Select(line => line.Split('\t'))
.GroupBy(items => items[1])
.Select(g =>
new
{
Division = g.Key,
ZipFiles = g.Sum(i => Convert.ToInt32(i[4])),
Conversions = g.Sum(i => Convert.ToInt32(i[5])),
ReturnedFiles = g.Sum(i => Convert.ToInt32(i[6])),
TotalEmails = g.Sum(i => Convert.ToInt32(i[7]))
});
Log myLog = new Log(destFileName);
statistics
.ToList()
.ForEach(d => myLog.Write(d.Division, d.ZipFiles, d.Conversions, d.ReturnedFiles, d.TotalEmails));
//Add error handlers
myLog.Close();
}
最終ログクラス...
#region Member Variables
StreamWriter dailyStats;
#endregion
public Log(string filename)
{
this.Open(filename);
}
#region Public Static Functions
public void Open(string tempFileName)
{
var sb = new StringBuilder();
if (!File.Exists(tempFileName))
{
dailyStats = File.AppendText(tempFileName);
sb.Append("Division");
sb.Append("\t");
sb.Append("Zip Files");
sb.Append("\t");
sb.Append("Conversions");
sb.Append("\t");
sb.Append("Returned Files");
sb.Append("\t");
sb.Append("Total E-Mails");
sb.Append("\t");
dailyStats.WriteLine(sb.ToString());
}
else
{
dailyStats = new StreamWriter(tempFileName);
}
}
public void Write(string division,
int zipFiles, int conversions, int returnedFiles, int totalEmails)
{
var sb = new StringBuilder();
if (writeLog)
{
sb.Append(division);
sb.Append("\t");
sb.Append(zipFiles);
sb.Append("\t");
sb.Append(conversions);
sb.Append("\t");
sb.Append(returnedFiles);
sb.Append("\t");
sb.Append(totalEmails);
sb.Append("\t");
dailyStats.WriteLine(sb.ToString());
}
}
public void Close()
{
dailyStats.Close();
}
}
みんなありがとう