C#(Visual Studio) ```### 前提・実現したいこと CSVファイルからデータの読み込みと、データの集計 ![イメージ説明](32cab75a4585c60b5e41e0a79bf61a43.png) C#(Visual Studio)でデータ集計アプリを作成しています。 [実行ボタン]クリック時にcsvファイルを読み込み、教科毎及び総合の最大点、最小点を求め さらにそれぞれの最高成績者を出力するアプリを作っています。 ### 発生している問題・エラーメッセージ デバック中に以下のエラーメッセージが表示されるのですが、対処方法がわからず困っています。 エラーメッセージ System.IndexOutOfRangeException: 'インデックスが配列の境界外です。' 以下対応箇所 listBox1.Items.Add("名前:" + stArrayData[0] + "国語:" + stArrayData[1] + "数学:" + stArrayData[2] + "英語:" + stArrayData[3]); ### 該当のソースコード C# ``` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Basic3 { public partial class Theme33 : Form { public Theme33() { InitializeComponent(); } /// <summary> /// 選択ボタンクリック /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SelectButton_Click(object sender, EventArgs e) { // OpenFileDialog の新しいインスタンスを生成する OpenFileDialog openFileDialog2 = new OpenFileDialog(); //ファイルのフィルタを設定する openFileDialog2.Filter = "txt ファイル|*.txt;*.log|csvファイル|*.*"; // ダイアログを表示し、戻り値が[OK] の場合は、選択したファイルを表示する if (openFileDialog2.ShowDialog() == DialogResult.OK) { //テキストボックスの値を選択したファイルに書き込み SelectFileBox.Text = openFileDialog2.FileName; } } /// <summary> /// 実行ボタンクリック /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ExecuteButton_Click(object sender, EventArgs e) { // 各教科点数 int Japanese = 0; int Math = 0; int English = 0; // 各教科最高点 int JapaneseMax = 0; int MathMax = 0; int EnglishMax = 0; // 各教科最低点 int JapaneseMin = 0; int MathMin = 0; int EnglishMin = 0; // 各教科合計 int JapaneseSum = 0; int MathSum = 0; int EnglishSum = 0; // 総合点 int Sum = 0; int SumMax = 0; int SumMin = 0; // 各教科平均 int JapaneseAve = 0; int MathAve = 0; int EnglishAve = 0; int SumAve = 0; //ファイルの存在確認 string fileName = SelectFileBox.Text; if (System.IO.File.Exists(fileName)) { //クラスのインスタンスの作成 StreamReader sr = new StreamReader(SelectFileBox.Text, System.Text.Encoding.Default); // カンマ区切りで分割して配列に格納する string[] stArrayData = fileName.Split(','); // ファイルを一行ずつ読み込み string item = sr.ReadLine(); // リストボックスの件数の取得 int num = listBox1.Items.Count; // 件数ボックスに件数を表示 NumberBox.Text = num.ToString(); // データ終了まで繰り返し while (item != null) { // リストボックスに追加 listBox1.Items.Add("名前:" + stArrayData[0] + "国語:" + stArrayData[1] + "数学:" + stArrayData[2] + "英語:" + stArrayData[3]); // 次の行の読み込み item = sr.ReadLine(); } // データ終了まで繰り返し while(item != null) { Japanese = int.Parse(stArrayData[1]); Math = int.Parse(stArrayData[2]); English = int.Parse(stArrayData[3]); //国語最高点の更新と出力 if (Japanese > JapaneseMax) { JapaneseMax = Japanese; japanesemaxscore.Text = JapaneseMax.ToString(); JapaneseMaxName.Text = stArrayData[0]; } //国語最低点の更新と出力 if (Japanese < JapaneseMin) { JapaneseMin = Japanese; japaneseminscore.Text = JapaneseMin.ToString(); } //数学最高点の更新と出力 if (Math > MathMax) { MathMax = Math; mathmaxscore.Text = MathMax.ToString(); MathMaxName.Text = stArrayData[2]; } //数学最低点の更新と出力 if (Math < MathMin) { MathMin = Math; mathminscore.Text = MathMin.ToString(); } //英語最高点の更新と出力 if (English > EnglishMax) { EnglishMax = English; englishmaxscore.Text = EnglishMax.ToString(); EnglishMaxName.Text = stArrayData[3]; } //英語最低点の更新 if (English < EnglishMin) { EnglishMin = English; englishminscore.Text = EnglishMin.ToString(); } //国語合計点 JapaneseSum = JapaneseSum + Japanese; //数学合計点 MathSum = MathSum + Math; //英語合計点 EnglishSum = EnglishSum + English; //総合合計点 Sum = JapaneseSum + MathSum + EnglishSum; //総合最高点の更新と出力 if (Sum > SumMax) { SumMax = Sum; summaxscore.Text = SumMax.ToString(); SumMaxName.Text = stArrayData[0]; } //総合最低点の更新と出力 if (Sum < SumMin) { SumMin = Sum; summinscore.Text = SumMin.ToString(); } } //国語平均点 JapaneseAve = JapaneseSum / num; japaneseave.Text = JapaneseAve.ToString(); //数学平均点 MathAve = MathSum / num; mathave.Text = MathAve.ToString(); //英語平均点 EnglishAve = EnglishSum / num; englishave.Text = EnglishAve.ToString(); //総合平均点 SumAve = Sum / num; sumave.Text = SumAve.ToString(); // ファイルを閉じる sr.Close(); } else { MessageBox.Show("ファイルパスが不正です"); } } } }
試したこと
C#を始めて1か月の初心者です。
エラーメッセージが出たのですが、対処方法がわからず困っています。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
コードは ``` と ``` で囲ってください。インデントされて読み役くなります。質問は回答者に読んでもらえないと意味がないのですから、読みやすくする努力をするのは質問者さんにとっても益があるはずです。
SurferOnWwwさん アドバイスありがとうございます。当方、初めて利用させていただくので使い方等、不慣れなものでして、、、参考にさせていただきます。
``` で囲うのは今からでも質問を編集してできますので、やってください。
余計なところも囲ったのでは? ``` で囲うのは C# のコード部分だけですよ。きちんとできてると、他人のスレッドを例にとって恐縮ですが、 https://teratail.com/questions/155542 というようになります。
回答3件
あなたの回答
tips
プレビュー