C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C#の配列の集計について


(過去ログ 129 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■76736 / inTopicNo.1)  C#の配列の集計について
  
□投稿者/ とむ (1回)-(2015/08/07(Fri) 17:39:15)

分類:[C#] 

C#の配列の集計についてご質問致します。当方C#を学び始めて一週間足らずです

テキストファイル1
a,100,50,30,22
a,20,30,44,67
a,204,52,56,100
b,100,50,30,22
b,20,30,44,67
b,204,52,56,100
c,100,50,30,22
c,20,30,44,67
c,204,52,56,100
d,100,50,30,22
d,20,30,44,67
d,204,52,56,100
e,100,50,30,22
e,20,30,44,67
e,204,52,56,100

テキストファイル2
a,324,132,130,189
b,324,132,130,189
c,324,132,130,189
d,324,132,130,189
e,324,132,130,189

テキストファイル1を読み込んで
先頭のアルファベット毎に配列を集計し
テキストファイル2のように出力を行いたいのですが
どのようなコードを書けば実現できるのか分かりません。
ご教授いただけませんでしょうか?


引用返信 編集キー/
■76737 / inTopicNo.2)  Re[1]: C#の配列の集計について
□投稿者/ 魔界の仮面弁士 (437回)-(2015/08/07(Fri) 18:55:19)
No76736 (とむ さん) に返信
> どのようなコードを書けば実現できるのか分かりません。

【案1】DataTable を使う

// 文字列パターンのチェック用正規表現
// 最初に「キー」となる文字列があり、その後ろにカンマで区切って数値が4つ続く
var pattern = new System.Text.RegularExpressions.Regex(@"^.+(,\d+){4}$");

// 元のテキストを格納するためのテーブル
var sourceTable = new System.Data.DataTable();
sourceTable.Columns.Add("Key", typeof(string));
sourceTable.Columns.Add("Value1", typeof(int));
sourceTable.Columns.Add("Value2", typeof(int));
sourceTable.Columns.Add("Value3", typeof(int));
sourceTable.Columns.Add("Value4", typeof(int));

// テキストファイルを読み込み、パターンに合致する行をテーブルに登録
var sourcePath = @"C:\temp\テキストファイル1.txt";
foreach (var line in System.IO.File.ReadAllLines(sourcePath))
{
 if(pattern.IsMatch(line))
 {
  sourceTable.Rows.Add(line.Split(','));
 }
}

// 重複する「キー」をまとめる
var view = new System.Data.DataView(sourceTable);
view.Sort = "Key";
var resultTable = view.ToTable(true, "Key");


// 「キー」ごとに集計してファイルに出力
var resultPath = @"C:\temp\テキストファイル2.txt";
using(var writer = new System.IO.StreamWriter(resultPath))
{
 foreach (System.Data.DataRow row in resultTable.Rows)
 {
  string key = (string)row["Key"];
  string fileter = "Key='" + key + "'";
  writer.WriteLine("{0},{1},{2},{3},{4}", key,
   sourceTable.Compute("SUM(Value1)", fileter),
   sourceTable.Compute("SUM(Value2)", fileter),
   sourceTable.Compute("SUM(Value3)", fileter),
   sourceTable.Compute("SUM(Value4)", fileter));
 }
}
引用返信 編集キー/
■76738 / inTopicNo.3)  Re[1]: C#の配列の集計について
□投稿者/ 魔界の仮面弁士 (438回)-(2015/08/07(Fri) 18:55:33)
No76736 (とむ さん) に返信
> どのようなコードを書けば実現できるのか分かりません。

【案2】Dictionary を使う


// 文字列パターンのチェック用正規表現
// 最初に「キー」となる文字列があり、その後ろにカンマで区切って数値が4つ続く
var pattern = new System.Text.RegularExpressions.Regex(@"^.+(,\d+){4}$");

// 集計結果を格納するクラス
var result = new Dictionary<string, int[]>();

// テキストファイルを読み込み、パターンに合致する行を取得
var sourcePath = @"C:\temp\テキストファイル1.txt";
foreach (var line in System.IO.File.ReadAllLines(sourcePath))
{
 if (pattern.IsMatch(line))
 {
  string[] entry = line.Split(',');
  string key = entry[0];

  // 「キー」ごとに集計して int の配列に足していく
  int[] values;
  if (result.ContainsKey(key))
  {
   // 登録済みのキーなら、以前作成した配列を再取得
   values = result[key];
  }
  else
  {
   // 未登録のキーなら、0 がセットされた配列を新規に用意
   result.Add(key, values = new int[] { 0, 0, 0, 0 });
  }

  // テキストから読み取った値を、int に変換しながら足していく
  values[0] += Convert.ToInt32(entry[1]);
  values[1] += Convert.ToInt32(entry[2]);
  values[2] += Convert.ToInt32(entry[3]);
  values[3] += Convert.ToInt32(entry[4]);
 }
}


// 集計結果をファイルに出力
var resultPath = @"C:\temp\テキストファイル2.txt";
using (var writer = new System.IO.StreamWriter(resultPath))
{
 foreach (var entry in result)
 {
   writer.WriteLine("{0},{1},{2},{3},{4}", entry.Key,
   entry.Value[0],
   entry.Value[1],
   entry.Value[2],
   entry.Value[3]);
 }
}
引用返信 編集キー/
■76739 / inTopicNo.4)  Re[2]: C#の配列の集計について
□投稿者/ とむ (2回)-(2015/08/07(Fri) 20:24:49)
No76738 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士 さん
詳細な所まで詳しく教えて頂きまして、ありがとうございます!
DataTableを使う方法とDictionaryを使う方法があるのですね!
C#初心者な私が見ても非常にわかりやすいです。
大変困っておりましたので助かりました。
本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -