質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

496閲覧

データを特定の項目ごとへの分けて処理をするようにしたい

kanayawa1

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2020/06/09 12:41

編集2020/06/09 13:50

前提・実現したいこと

C#を始めて1ヶ月の者です。
ログの集計をしています。
下記のログから日付とオペレーターごとの実行平均時間を求めようとしています。
1992-11-10 12:23.23 [12] tag:START operator:Me
1992-11-10 12:23.25 [12] tag:END operator:Me
1992-11-10 12:24.11 [12] tag:START operator:Me
1992-11-10 12:24.23 [12] tag:END operator:Me
1992-11-10 12:45.25 [8] tag:START operator:Father
1992-11-10 12:46.23 [8] tag:END operator:Father

私の作成のしたものが間違っており、以下のような指摘をされました。
「スレッド([12],[8])ごとに分けて、END-STARTで差を求めなさい」
どのようにしてスレッドごとに分ければいいのかが分かりません。
どなたか教えていただけませんか。

該当のソースコード

C#

1static void main(){ 2 System.IO.StreamReader file =new System.IO.StreamReader(@"c:\test.txt"); //ログを読み込む 3while((line = file.ReadLine()) != null) 4{ 5 string date = line.Substring(0,10); //日付を抜き出す 6 string thread = line.Substring(20,5); //threadを抜き出す 7 string tag = line.Substring(25,10); //tagを抜き出す 8   string operator = line.Substring(35,12); ////operatorをぬきだす 9 string time = line.Substring(11,9);  //timeを抜き出す 10   string key = date + ',' + thread + ',' + tag + ',' + operator; //keyを設定 11 12    13

試したこと

DictionaryのKeyに設定したkeyを、Valueにtimeをとってthreadごとに分けようとしました。
しかし、DictionaryのKeyは一意であるため、同じkeyは入れられないという問題が起こります。
どのようにして、threadごとに分ければ良いでしょうか?

補足情報(FW/ツールのバージョンなど)

Visual Stadioを使用しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/06/09 13:27

すごく紛らわしんですが、これは一般的な意味でのThreadの話ではなく、データ項目中の特定の項目ごとに集計をする方法を質問したい、という意味なんですよね。 単にThreadという表現を使ってしまうと、System.Threading.Threadクラスで表される「処理単位としてのスレッド」を連想するので、ちょっと表現変えた方が良さそう。
kanayawa1

2020/06/09 13:35

ご指摘ありがとうございます。 スレッド[8]の実行時間と[12]の実行時間を求めるにはどのようにすれば良いでしょうか。 例の[8],[12]は例で用意したものであるため、普段はもっとおおくのスレッドがあるため、決めうちせずに作成できればと思っています。
Hey_CH

2020/06/09 14:27

確認なのですが、時間と思しき場所に「12:23.23」とありますが、これは12時23分23秒の事ですか?
kanayawa1

2020/06/09 14:33

ご質問ありがとうございます。 その通りです。
guest

回答1

0

ベストアンサー

以下のような感じでDictionary<string, List<Log>>のようにする事でスレッドごとに分けることができます。
Logというのは自作クラスで、ログの1行を意味のある形で格納するクラスです。

C#

1 class Program { 2 static void Main(string[] args) { 3 using (StreamReader file = new StreamReader("test.txt")) { 4 var line = ""; 5 Dictionary<string, List<Log>> log = new Dictionary<string, List<Log>>(); 6 while ((line = file.ReadLine()) != null){ 7 Log l = new Log(line); 8 //ThreadをKeyにしてDictionaryに格納 9 if (log.ContainsKey(l.Thread)) { 10 log[l.Thread].Add(l);//Keyが存在していれば追加 11 } else { 12 log.Add(l.Thread, new List<Log> { l });//Keyが無ければ新規作成 13 } 14 } 15 16 //ここから先は質問事項ではない 17 foreach (var key in log.Keys) { 18 var list = log[key]; 19 TimeSpan ts = new TimeSpan(); 20 string ope= list[0].Operator;//Threadが同じだとOperatorも同じ? 21 for (int i = list.Count - 1; i >= 0; i -= 2) { 22 var start = list[i - 1].DateTime; 23 var end = list[i].DateTime; 24 ts += (end - start); 25 } 26 //出力 27 Console.WriteLine(ts.ToString(@"hh\:mm.ss") + " [" + key + "] operator:" + ope); 28 } 29 Console.Read(); 30 } 31 } 32 } 33 public class Log { 34 public string Date; 35 public DateTime DateTime; 36 public string Thread; 37 public string Tag; 38 public string Operator; 39 public Log(string line) { 40 string[] ps = line.Split(' '); 41 Date = ps[0]; 42 DateTime = DateTime.ParseExact(ps[0] + " " + ps[1],"yyyy-MM-dd HH:mm.ss", null); 43 Thread = ps[2].Substring(1, ps[2].Length - 2); 44 Tag = ps[3].Substring(4); 45 Operator = ps[4].Substring(9); 46 } 47 }

投稿2020/06/09 15:10

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kanayawa1

2020/06/10 12:25

ありがとうございます。 自作のclassを作成するなどのテクニックを使用しないと難しいのでしょうか?
Hey_CH

2020/06/10 12:35

Dictionary<string, List<string[]>>でも良いと思いますが、DateTimeとかわかりやすくなると思います。 string[]の何番目が何の項目かすぐに理解できるなら不要かもしれませんが、ほかの誰かに見せるなら別クラスにした方がベターという感じでしょうかね。
kanayawa1

2020/06/10 12:41

ありがとうございます。 まだC#の基礎的な文法を覚えるので精一杯ですが、少しづつでも自分で関数やclassを作るというのをやっていきたいと思います。
Hey_CH

2020/06/10 13:00

はい、頑張ってください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問