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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

0回答

2718閲覧

C#でのcsv作成・読み込みからグラフ作成

Saturn7577

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2021/12/20 05:20

編集2021/12/21 07:40

前提・実現したいこと

C#のWindowsフォームアプリケーションを用いて、「センサから受け取った値を次々にcsvファイルに保存し、その保存したものと既存のものとの差を最新の一つだけグラフ上に点として表示する」というものを作るために、まず「csvファイルに一秒ごとに数値を保存し、それと既存のファイルとの差を一秒ごとにグラフ上に最新の一つだけ表示する」というものを作成しようと思いました。
またC#を触ることが初めてで、色々見ながらしてみたため読みづらく拙いと思いますがよろしくお願いします。

発生している問題・エラーメッセージ

117行目の StreamWriter sw = new StreamWriter("test3.csv", true);の部分でグラフに一つ目をプロットした後にエラーメッセージが発生しました。

エラーメッセージ
System.IO.IOException: '別のプロセスで使用されているため、プロセスはファイルにアクセスできません

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Drawing; 4using System.Windows.Forms; 5using System.IO; 6using System.Windows.Forms.DataVisualization.Charting; 7 8namespace WindowsFormsApp3 9{ 10 11 public partial class Form1 : Form 12 { 13 private int i = 0; 14 15 //リストの作成 16 List<string> lists1 = new List<string>(); 17 List<string> lists2 = new List<string>(); 18 19 public Form1() 20 { 21 InitializeComponent(); 22 23 24 //貼り付けたChartコントロールには、初期値のデータがセットされているので、一旦クリアします 25 chart1.ChartAreas.Clear(); 26 chart1.Series.Clear(); 27 28 //「chartArea」という名前のエリアを生成します 29 ChartArea chartArea = new ChartArea("chartArea"); 30 31 //生成したエリアをChartコントロールに追加します 32 chart1.ChartAreas.Add(chartArea); 33 34 //Series(系列)を生成します 35 Series series1 = new Series(); 36 37 //系列の種類を指定 38 series1.ChartType = SeriesChartType.FastPoint; 39 40 //系列の凡例を設置します 41 series1.LegendText = "中心"; 42 43 //系列のポイント情報をセットします 44 45 series1.Points.AddXY(0, 0); 46 47 //生成・設定した系列をChartコントロールに追加します 48 chart1.Series.Add(series1); 49 50 51 //グラフの軸表示を設定します 52 chart1.ChartAreas[0].AxisX.Minimum = -10; 53 chart1.ChartAreas[0].AxisX.Maximum = 10; 54 chart1.ChartAreas[0].AxisY.Minimum = -1; 55 chart1.ChartAreas[0].AxisY.Maximum = 1; 56 //Y軸の間隔を決めます 57 chart1.ChartAreas[0].AxisY.Interval = 1; 58 chart1.ChartAreas[0].AxisX.Interval = 1; 59 60 //点の種類を決めます 61 series1.MarkerSize = 10; 62 63 //ラベルの非表示 64 chart1.ChartAreas[0].AxisX.LabelStyle.Enabled = false; 65 chart1.ChartAreas[0].AxisY.LabelStyle.Enabled = false; 66 chart1.ChartAreas[0].AxisX.MajorTickMark.Enabled = false; 67 68 //x軸・y軸の非表示 69 chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false; 70 chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false; 71 72 Series series2 = new Series(); 73 series2.ChartType = SeriesChartType.FastPoint; 74 series2.MarkerSize = 12; 75 76 //系列の凡例を設置します 77 series2.LegendText = "位置"; 78 79 //series2の点の色を指定 80 series2.Color = Color.FromArgb(255, 0, 0); 81 82 //生成・設定した系列をChartコントロールへ追加 83 chart1.Series.Add(series2); 84 85 86 87 //csvファイルを読み込む 88 using (StreamReader sr = new StreamReader(@"test1.csv")) 89 { 90 91 //配列からリストに格納する 92 while (!sr.EndOfStream) 93 { 94 // CSVファイルの一行を読み込む 95 string line = sr.ReadLine(); 96 // 読み込んだ一行をカンマ毎に分けて配列に格納する 97 string[] values = line.Split(','); 98 lists1.AddRange(values); 99 100 } 101 } 102 103 using (StreamReader sr2 = new StreamReader(@"test3.csv")) 104 { 105 //配列からリストに格納する 106 107 while (!sr2.EndOfStream) 108 { 109 // CSVファイルの一行を読み込む 110 string line = sr2.ReadLine(); 111 // 読み込んだ一行をカンマ毎に分けて配列に格納する 112 string[] values = line.Split(','); 113 lists2.AddRange(values); 114 115 } 116 } 117 118 119 120 //タイマーの開始 121 timer1.Start(); 122 123 //1秒感覚で表示を更新する 124 timer1.Interval = 1000; 125 126 timer1.Enabled = true; 127 } 128 129 //タイマー部分の動作設定 130 private void Timer1_Tick(object sender, EventArgs e) 131 { 132 //古い座標を削除する 133 if (i > 0) 134 { 135 chart1.Series[1].Points.RemoveAt(0); 136 } 137 138 using (StreamWriter sw = new StreamWriter("test3.csv", true)) 139 { 140 //次の座標に移動する 141 if (i < lists1.Count) 142 { 143 sw.WriteLine(i); 144 i++; 145 } 146 sw.Close(); 147 } 148 149 150 151 //系列のポイント情報を設定します 152 chart1.Series[1].Points.AddXY(int.Parse(lists1[i]) - int.Parse(lists2[i]), 0); 153 154 155 } 156 } 157} 158

試したこと

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

Visual Studio 2022を使用しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/20 05:42

まず、何はともあれ、コードは ``` と ``` で囲いましょう(``` はバッククォート 3 つ)。インデントされて見やすくなるので。インデントされてないコードはあなたも見る気がしないのでは?
Saturn7577

2021/12/20 06:07

すいません! ご指摘ありがとうございます、修正させていただきました。
退会済みユーザー

退会済みユーザー

2021/12/20 08:07 編集

StreamReader とか StreamWriter とか(FileStream とか File なども使っていればそれも)は全て、using 句を使って使い終わったら確実に Dispose されるようするという基本を守るようにしてはいかがですか? それ以上のことは提示されているコードを子細に読んで理解して場合によっては動かしてみないと分からないので、自分はそこまではできません。それを回答者に期待するなら、もう少し切り分けして Chart とかエラーと関係ない部分は外して、問題を再現できる必要最低限のコードまで削っていただければと思います。その過程で原因が分かって自己解決できることも多いのですよ。
Saturn7577

2021/12/20 16:38

了解しました。 一度基本から見直して小分けにしてみようと思います。 アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問