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

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

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

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

Q&A

解決済

3回答

8139閲覧

C#で簡単な家計簿を作っています。

sheephuman

総合スコア112

C#

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

1グッド

0クリップ

投稿2016/08/26 06:49

編集2016/08/26 10:31

###C#で簡単な家計簿を作っています。

サンプルファイル
https://box.yahoo.co.jp/guest/viewer?sid=box-l-jjsgnkx53gwi3lt2r7nmvpbfvm-1001&uniqid=531860b3-5b7e-437d-96f3-941d666e5691&viewtype=detail

CSVを読み込ませて、系列毎に集計させてグラフ表示させたいのですが、方法が分かりません。

###該当のソースコード

using System; using System.Windows.Forms; using System.IO; using System.Windows.Forms.DataVisualization.Charting; using System.Data.OleDb; using System.Data; using System.Drawing; private void graph_chart_display() { chart1.Series[0].Name= "電気代"; chart1.Series.Add("水道代"); chart1.Series.Add("雑費"); string current = Directory.GetCurrentDirectory(); // Full path to the data source file string path = current +"\"; // Create a connection string. string ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + " " + path + ";Extended Properties=\"Text;HDR=No;FMT=Delimited\""; OleDbConnection myConnection = new OleDbConnection(ConStr); // Create a database command on the connection using query string mySelectQuery = "Select * from"+ "\sample.csv" ; OleDbCommand myCommand = new OleDbCommand(mySelectQuery, myConnection); // Open the connection and create the reader myCommand.Connection.Open(); OleDbDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); chart1.Series[0].Color = ColorTranslator.FromHtml("#0033FF"); chart1.ChartAreas[0].InnerPlotPosition.Width = 90; chart1.ChartAreas[0].InnerPlotPosition.Height = 90; chart1.ChartAreas[0].InnerPlotPosition.X = 8; chart1.ChartAreas[0].InnerPlotPosition.Y = 0; chart1.ChartAreas[0].AxisX.Title = "支出"; chart1.ChartAreas[0].IsSameFontSizeForAllAxes = true; chart1.Series[0].Points.DataBindXY(myReader, "2", myReader, "0"); // Close connection and data reader myReader.Close(); myConnection.Close(); } }

###出力
https://pbs.twimg.com/media/CqxCaAoWgAEJJON.jpg:large

![イメージ説明

ここで、電気代、水道代といった個別の集計を出したい。
・水道代は水色の棒グラフ
・雑費はオレンジ色 といった感じです。

単純なサンプルのcsvを同梱してますが

66,電気代,8月26日
666,電気代,8月26日
666,電気代,8月26日
123,電気代,8月26日
123,水道代,8月26日
432,水道代,8月26日
423,雑費,8月26日
432,雑費,8月26日
としています。

###試したこと
単純に検索しても、とっかかりらしきモノが全く見つかりません。要するに「何をすればいいか」わかりません。
3年前から全く進まずに悩んでいます。
とにかく的確な回答を望みます。

試しに
66,電気代
666,電気代
666,電気代
123,電気代
123,水道代
432,水道代
423,雑費
432,雑費

としました。

結果

イメージ説明
・・・置き換わっただけですね。

5o5o_wagon👍を押しています

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

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

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

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

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

alg

2016/08/26 09:39

・コードはコードブロックで囲んでいただけませんか?コードを選択して「<code>」ボタンを押すとコードブロックになります。 ・タグは C よりも C# のほうが、回答が得やすくなると思います。
sheephuman

2016/08/26 10:27

C#は全角じゃないと通らないんですかね。半角だと”C”になるようです。  「C#」と入れたので、C#タグが付いているものと認識していました。
sheephuman

2016/08/26 10:32

C#と入れてEnterキーを押したら、#だけ消えていた。
guest

回答3

0

ベストアンサー

要するに「何をすればいいか」わかりません

そういうときは、問題を分割してみてはいかがでしょうか。

やりたいことは

CSVを読み込ませて、系列毎に集計させてグラフ表示させたい

ですから、分割すると

1.CSVを読み込ませる
2.系列毎に集計する
3.グラフ表示する

となります。
コードを見たところ1と3はすでにできているように見受けられますので、2をなんとかすればよさそうです。

CSV読込部分はOleDbを使ってRDBのように読み取っていますので、集計にSQL文が使えます。
SQL文で集計をするときはSUMGROUP BYを使います。

ということで、データを取得しているSQL文を修正します。

csharp

1string mySelectQuery = "Select * from"+ "\\sample.csv" ;

csharp

1string mySelectQuery = "SELECT F2,SUM(F1) AS F1S FROM \\sample.csv GROUP BY F2 ORDER BY F2";

SQL文を修正したことにより、グラフにバインドすべき列が変わりましたので、バインド部分に反映します。

csharp

1chart1.Series[0].Points.DataBindXY(myReader, "2", myReader, "0");

csharp

1// 0列目(F2)が系列名、1列目(SUM(F1))が値 2chart1.Series[0].Points.DataBindXY(myReader, "0", myReader, "1");

以上の修正で、とりあえず「系列ごとに集計」はできていませんか?
(グラフの色を凡例と合わせて変えるところまではできていませんが)

投稿2016/08/26 10:24

alg

総合スコア2019

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

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

sheephuman

2016/08/26 10:44

ありがとうございます!とても助かりました! 長年、自力だけで解決を試みてきましたが、他人が書いたクラスとかも上手く利用できずに苛立っていました。 自分ではそこそこ上手く質問したつもりだったんですが、上手く区切れてなかったですね・・・。
alg

2016/08/26 10:56

状況を完全に再現できるソースがアップされておりましたので、すぐに状況を確認することができました。その点では回答者にやさしい質問だったと思います。 解決して良かったです(^^)
guest

0

あれから長い時間が経ってしまいましたが、一応の成果は上がりました。

 ```C#

private void graph_chart_display() { chart1.Series.Clear(); chart1.Series.Add("合計"); chart1.Series[0].ToolTip = "#VAL{C}"; chart1.Series[0].Label = "#VAL{C}";

           

chart1.Series[0].Color = CommmonColor; try { string current = Directory.GetCurrentDirectory(); // Full path to the data source file string file = comboBox1.Text; string path = current + "\kakeibo\"; // Create a connection string. string ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Text;HDR=No;FMT=Delimited\""; OleDbConnection myConnection = new OleDbConnection(ConStr); string mySelectQuery = "SELECT F3,Sum(F1) FROM " + "\" + file + " Group by f3 Order by Format(F3,'MMDD')";  //この辺は見つけるの苦労しました。月日のソートです。 //string mySelectQuery = "SELECT F2, SUM(F1) AS F1S" + "WHERE F2 LIKE '%水道代%' GROUP BY F2 ORDER BY F2 FROM" +"\" + file; OleDbCommand myCommand = new OleDbCommand(mySelectQuery, myConnection); // Open the connection and create the reader myCommand.Connection.Open(); OleDbDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); chart1.ChartAreas[0].InnerPlotPosition.Width = 90; chart1.ChartAreas[0].InnerPlotPosition.Height = 90; chart1.ChartAreas[0].InnerPlotPosition.X = 8; chart1.ChartAreas[0].InnerPlotPosition.Y = 0; chart1.ChartAreas[0].AxisX.Title = "支出"; chart1.ChartAreas[0].IsSameFontSizeForAllAxes = true; chart1.Series[0].Points.DataBindXY(myReader, "0", myReader, "1"); myReader.Close(); myConnection.Close(); } catch (OleDbException OleEx) { //Console.WriteLine(OleEx.ToString()); MessageBox.Show(OleEx.Message); } }
![イメージ説明](0754fe5aaea6aa63bf8bc220257a1a16.png) 拙いものですが、成果物として。 [http://mojakouinfotaker.blog.fc2.com/blog-entry-948.html](http://mojakouinfotaker.blog.fc2.com/blog-entry-948.html)    DataTableも使ってない物ですが、個人的に使っています。  項目ごとに色分けして表示する方法ですが、Order by F2で抽出したものを順番に chart1.Series[0] chart1.Series[1],,,,,と順番に流し込めば行けるのかなと思います。クエリ自体は単純に文字列”String”なため、List型に一旦流し込んでという感じでしょう。

投稿2017/11/25 05:32

編集2017/11/25 07:52
sheephuman

総合スコア112

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

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

0

C#

1private void graph_chart_display(object sender, EventArgs e) 2{ 3 string legend = "グラフ1"; 4 5 chart1.Series.Clear(); //グラフ初期化 6 7 chart1.Series.Add(legend); //グラフ追加 8 //グラフの種類を指定(Columnは棒グラフ) 9 chart1.Series[legend].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column; 10 chart1.Series[legend].LegendText = legend; //凡例に表示するテキストを指定 11 12 string[] xValues = new string[] { "A", "B", "C", "D", "E" }; 13 int[] yValues = new int[] { 10, 20, 30, 40, 50 }; 14 15 for (int i = 0; i < xValues.Length; i++) 16 { 17 //グラフに追加するデータクラスを生成 18 System.Windows.Forms.DataVisualization.Charting.DataPoint dp = new System.Windows.Forms.DataVisualization.Charting.DataPoint(); 19 dp.SetValueXY(xValues[i], yValues[i]); //XとYの値を設定 20 dp.IsValueShownAsLabel = true; //グラフに値を表示するように指定 21 chart1.Series[legend].Points.Add(dp); //グラフにデータ追加 22 } 23}

で配列の部分にCSVで読み込んだ値を入れるようにすればよいのではないでしょうか?
参考URL
http://nogusa.hateblo.jp/entry/20100913/1284395352

投稿2016/08/26 06:58

s.t.

総合スコア2021

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

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

sheephuman

2016/08/26 07:14

あのー、それは的確な回答なんでしょうか・・・・ 自分は最初、上記のページを参考に作りましたが、使い勝手の悪い代物です。 今ではふつー、 List<int> TotalCalc = new List<int>(); for (int i = 0; i < dataGridView1.Rows.Count; i++) { //if (i == 0) { label3.Text = (Convert.ToDecimal(dataGridView1.Rows[i].Cells[0].Value)).ToString(); } if (i >= 0) { //if (i + 1 == dataGridView1.Rows.Count) break; TotalCalc.Add(Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value)); } } label3.Text = TotalCalc.Sum().ToString("C"); のようにします。 また、当質問に当てはめると  Microsoft.Jet.OLEDB.4.0 を使っていますので、そこの弄り方を教えて頂けると大変助かるのですが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問