3

検索しましたが、答えが見つかりません。免責事項:私はC#を初めて使用しますが、次のプログラムを作成する作業があります:既存のログファイルから読み取り、タブで解析し、結果を特定のステータスに制限します(電子メールを処理します)、部門ごとにグループ化します(つまり、Investment Bank)、次に、部門ごとの電子メールの変換量の統計を計算し、新しいログファイルに出力します。

質問をする前に、プログラム自体について少し背景を説明したかった。私は現在、部門ごとにグループ化したいと思っているところですが、その方法がわかりません。

編集:元のデータ:

Status          Division      Time          Run Time    Zip Files   Conversions Returned Files  Total E-Mails   
Process E-mail  Investment Bank  12:00 AM   42.8596599  1               0               1             1 
End Processing                   12:05 AM   44.0945784  0               0               0             0 
Process E-mail  Investment Bank  12:10 AM   42.7193253  2               1               0             1 
Process E-mail  Treasury         12:15 AM   4.6563394   1               0               2             2

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

static void Main()
{
    {

        List<string> list = new List<string>();
        using (StreamReader reader = new StreamReader(Settings.LogPath + "2012-3-10.log"))
        {
            string line;
            int i = 0;
            while ((line = reader.ReadLine()) != null)
            {
                list.Add(line);
                i++;

                string[] split = line.Split('\t');

                string processing = split[0];

                    if(processing.StartsWith("Process"))
                    {
                        string division = split[1];
                        int zipFiles;
                        int.TryParse(split[4], out zipFiles);
                        int conversions;
                        int.TryParse(split[5], out conversions);
                        int returnedFiles;
                        int.TryParse(split[5], out returnedFiles);
                        int totalEmails;
                        int.TryParse(split[5], out totalEmails);

だから私はそれが次のようにコンソールに何かを吐き出すところまでプログラムを持っています:

Investment Bank
1
0
1
1

Treasury
1
0
2
2

Investment Bank
2
1
0
1

私が今やろうとしているのは、「投資銀行」や「財務」などでグループ化して、合計を計算できるようにすることです。

最終的なログファイルは次のようになります。

Division         Zip Files Conversions Returned Files Total E-mails
Investment Bank   3            1             1              2
Treasury          1            0             2              2
4

2 に答える 2

1

次のコードは、必要なことを実行します。

string filename = @"D:\myfile.log";
var statistics = File.ReadLines(filename)
    .Where(line => line.StartsWith("Process"))
    .Select(line => line.Split('\t'))
    .GroupBy(items => items[1])
    .Select(g =>
            new 
                {
                    Division = g.Key,
                    ZipFiles = g.Sum(i => Int32.Parse(i[2])),
                    Conversions = g.Sum(i => Int32.Parse(i[3])),
                    ReturnedFiles = g.Sum(i => Int32.Parse(i[4])),
                    TotalEmails = g.Sum(i => Int32.Parse(i[5]))
                });

Console.Out.WriteLine("Division\tZip Files\tConversions\tReturned Files\tTotal E-mails");
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));

匿名クラスを台無しにせず、代わりに配列を使用する場合は、さらに短くなる可能性があります(ただし、明確ではありません)。あなたがそのようなコードに興味を持っているかどうか私に知らせてください。

于 2012-04-04T14:28:14.840 に答える
0

次に、これを処理するクラスを作成します。

何かのようなもの

public class xxxx
{
    Public string Division {get;set}
    Public Dictionary<string,int> something{get;set;}
}

次に、それらをカプセル化することができます

List<xxx> Divisions;

これが最適かどうかはわかりませんが、機能します。

于 2012-04-04T14:03:33.497 に答える