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

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

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

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

3回答

2450閲覧

``` C# 文字列分解、変数、データの集計

asaringo

総合スコア13

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/11/01 05:03

編集2018/11/01 06:42
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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/01 05:43

コードは ``` と ``` で囲ってください。インデントされて読み役くなります。質問は回答者に読んでもらえないと意味がないのですから、読みやすくする努力をするのは質問者さんにとっても益があるはずです。
asaringo

2018/11/01 05:53

SurferOnWwwさん アドバイスありがとうございます。当方、初めて利用させていただくので使い方等、不慣れなものでして、、、参考にさせていただきます。
退会済みユーザー

退会済みユーザー

2018/11/01 05:58

``` で囲うのは今からでも質問を編集してできますので、やってください。
退会済みユーザー

退会済みユーザー

2018/11/01 06:12

余計なところも囲ったのでは? ``` で囲うのは C# のコード部分だけですよ。きちんとできてると、他人のスレッドを例にとって恐縮ですが、 https://teratail.com/questions/155542 というようになります。
guest

回答3

0

ベストアンサー

splitでstArrayDataに格納するのはfileNameではなくitemでは?

デバッガの使い方を学習して、変数の値を確認するなどするようにしてください。
デバッグ作業には必須です。
チュートリアル: Visual Studio を使用してデバッグする方法を学習します。

投稿2018/11/01 05:13

編集2018/11/01 05:17
YAmaGNZ

総合スコア10258

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

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

asaringo

2018/11/01 05:24

YAmaGNZさん、回答ありがとうございます。 splitでstArrayDataに格納するものなんですが、itemを格納すると、 ”宣言する前にローカル変数"item"を使用できません。”とエラーメッセージが出てきてしまいます。 実装するとcsvデータは一応カンマ区切りで抽出できているので問題はないかと思っていたのですが、 ここが問題だったのでしょうか?
YAmaGNZ

2018/11/01 05:36

多分、記述する場所が違います。 ファイルから1行読み込んだ後にsplitする流れになります。 1行づつの処理となりますので、読み込みはwhileの中でも行っていますので、必然的にsplitするのもwhileの中になります。
asaringo

2018/11/01 06:11

修正してみます。ありがとうございます。
guest

0

C#

1// カンマ区切りで分割して配列に格納する 2string[] stArrayData = fileName.Split(','); 3 4// ファイルを一行ずつ読み込み 5string item = sr.ReadLine();

上記がおかしいため想定と違う値になっている気がします。
正しくは以下ではないでしょうか。
ファイル名をカンマで分割したいのではなく、読み込んだ結果を分割したいのでは?

C#

1List<string[]> Data = new List<string[]>(); 2 3// ファイルを一行ずつ読み込み 4while(sr.Peek() != -1) 5{ 6 string[] stArrayData = sr.ReadLine().Split(','); 7 Data.Add(stArrayData); 8}

他にも修正は必要と思いますが、一番怪しいのは上記です。
お力になれれば幸いです。

投稿2018/11/01 05:21

shun_kuwa

総合スコア187

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

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

asaringo

2018/11/01 06:10

shun_kuwaさん、ご丁寧にありがとうございます。
guest

0

直接の回答にならず申し訳ないのですが、添削サービスではないので。
今は2018年11月なので、最低でもこういう風に書いてある資料を参考に学習を再開始することをおすすめします。

csharp

1static void Trial(string path) 2{ 3 var data = File.ReadLines(path).Select(line=>line.Split(',').ToArray()).ToArray(); 4 var jMax = data.Max(l => int.Parse(l[1])); 5 var jMaxName = data.First(l => l[1] == jMax.ToString())[0]; 6 var mMax = data.Max(l => int.Parse(l[2])); 7 var mMaxName = data.First(l => l[2] == jMax.ToString())[0]; 8 var eMax = data.Max(l => int.Parse(l[3])); 9 var eMaxName = data.First(l => l[2] == jMax.ToString())[0]; 10 var jMin = data.Min(l => int.Parse(l[1])); 11 var mMin = data.Min(l => int.Parse(l[2])); 12 var eMin = data.Min(l => int.Parse(l[3])); 13 var jAve = data.Average(l => int.Parse(l[1])); 14 var mAve = data.Average(l => int.Parse(l[2])); 15 var eAve = data.Average(l => int.Parse(l[3])); 16}

投稿2018/11/01 07:49

papinianus

総合スコア12705

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

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

papinianus

2018/11/01 07:49

めんどいんでもうあれですが、最初にタプルにすべきでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問