1

現在、ディレクトリから既存のログファイルを取得し、各ログファイルを実行して統計を計算し、そこから新しいファイルを作成するプログラムがあります。

ログファイルは現在、次のように名前が付けられています: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();
    }
}

みんなありがとう

4

1 に答える 1

1
  String filename = "2012-4-24.log";
  String file = Path.GetFileNameWithoutExtension(filename);
  String[] parts = file.Split('-');
  if (parts.Length == 3)
  {
    String year = parts[0];
    String month = parts[1];
    String day = parts[2];

    Console.WriteLine(string.Format("year:{0} - month:{1} - day:{2}", year, month, day));
  }
于 2012-04-25T16:51:22.053 に答える