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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

11653閲覧

csvファイルの読み込みとListでの利用【Java】

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

1クリップ

投稿2020/05/07 17:34

編集2020/05/08 00:40

前提・実現したいこと

Eclipseを使ってcsvファイルを読み取り、データをListに格納し、利用したいです。
csvファイルの中身は以下のようなものです。

クラス,生徒の姓名,科目,点数
1-1,山田太郎,国語,76
1-2,太田和弘,数学,87
(以下同様のデータが制限なく続く)

生徒の姓名に重複はなく、科目は生徒によって受けている、いないものがあります。

これを読み取りクラスで一行ずつ読み取り、Personクラスでそれぞれの生徒の合計点などを算出するメソッドを作り、以下のように出力したいです。

名前:山田太郎 合計点:412 科目数:5教科

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

恐らくcsvファイルの読み込みは成功しているのですが、Listへの格納の仕方、そこから別のクラスでどう使えばいいのかさっぱりです。独学のためおかしい部分は多くあるかと思います。

該当のソースコード

java

1 2// 読み取りクラス 3public void schoolDate(){ 4 ArrayList<Student> csvdata = new ArrayList<Student>(); 5 6 File fl = new File("Test.csv")7 8 try (FileReader fr = new FileReader(fl): 9 BufferedReader in = new BufferedReader(fr)){ 10 11 String s; 12 while((s = in.readLine()) != null){ 13 // カンマ区切りでListに入れる? 14 } 15 } catch (IOException ex) { 16 ex.printStackTrace(); 17 } 18} 19 20// Personクラス 21public class Person { 22 23 private String class; 24 private String name; 25 private List<Subject> subjects = new ArrayList<Subject>(); 26 27 public Student(String _class, String _name){ 28 class = _class; 29 name = _name; 30 } 31 32 public int calcSum(){ 33 // 各生徒の合計点の算出 34 return sum; 35 } 36 37 // 以下アクセサメソッドなど 38}

試したこと

Studentクラスを作ってその中でどうにか引っ張ってこれないか

補足情報

休暇明けの講義で急に出た課題のため、Listや読み取りなどに対しての知識はほぼない状態で、見様見真似で書いています。Java初心者ですが、頂ける解答にできるだけついていけるよう、頑張りますのでよろしくお願いします。

(追記)swordone様
ご指摘ありがとうございます。「名前が重複しない」というのは、例えば山田太郎というnameがあれば、山田次郎は存在しないというような、同じ姓か名を持たない、という意味でした。誤解を与えてしまい、申し訳ありません。
Personクラスについては修正いたしました。ありがとうございます。

(追記)mo-monga様
subjectには受けた科目を格納したいと考えています。
データのサンプルは以下のようなものでよいでしょうか。

1-1,山田太郎,国語,76 1-2,太田和弘,数学,87 1-1,伊藤淳,理科,65 1-1,斎藤博,社会,57 1-3,田中郁美,理科,59 1-1,山田太郎,数学,45 1-3,柳瀬徹,英語,58 1-2,彦坂直樹,社会,82 1-3,田中郁美,国語,87

すみません。分からないことだらけのまま質問を投稿してしまったため、不愉快な思いをさせてしまいました。自分でも調べ、出来る限りこちらに追記していきます。

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

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

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

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

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

swordone

2020/05/07 17:56

入力例を読む限り、1行には1科目の得点しか書かれていないように見えます。これである人物が複数教科を受けたとしたら、同じ名前の別の行が必要なはずで、「名前が重複しない」という条件と相反します。 またPersonクラスと言っているのにコードはStudentクラスです。
退会済みユーザー

退会済みユーザー

2020/05/07 18:08

ご指摘ありがとうございます。修正いたしました。
swordone

2020/05/07 19:07

いやなんの解決にもなってねぇ…
momon-ga

2020/05/07 23:49

vate List<Subject> subjects = new ArrayList<Subject>(); とありますが、subjectsには何を格納する想定ですか?
momon-ga

2020/05/08 00:06 編集

”山田太郎 合計点:412 科目数:5教科” が、出力されるCSVデータのサンプルを提示してください。 また、Person(Student)に、どのように値が設定されるのか教えてください。
momon-ga

2020/05/08 01:12 編集

ソース中の while((s = in.readLine()) != null){ // カンマ区切りでListに入れる? } このListに入れようとしてるのは、Subjectでなく、Person(Student)であってます? おっと、 ArrayList<Student> csvdata = new ArrayList<Student>(); ですね。
退会済みユーザー

退会済みユーザー

2020/05/08 01:29

ありがとうございます。その通りです。 生徒の数が現時点では把握しきれない為、出来れば配列ではなくListに入れた方がよいのかな、と思ったのですが、Listへの理解が甘く、上手くいっていない点が多々あります。
momon-ga

2020/05/08 01:51 編集

そういえば、swordoneさんが言っていたのは 1-1,山田太郎,国語,76 1-1,山田太郎,数学,45 みたいなデータがあるなら、名前は重複してるよね?ってことですよ。 名前が重複しないなら・・・ 1-1,山田太郎,国語,76,数学,45 1-1,山田次郎,数学,45 みたいな、可変長のcsvになるのでは?と確認したかったと思われ
guest

回答1

0

ベストアンサー

まず。class Person となっているものを、Studentにします。
つぎに、そのStudentにequalsを実装することが前提です。

ちなみに、このequalsは厳密なものでなく単純に同性同名のチェックでよいです。

厳密には情報たりてないんでイメージにしかなりませんが。
だいたい、こんな感じになろうかと。

Listへの入れ方の前に、データをどう管理するかを考えないとダメです。
というか、それが考えられていないから、どうしていいかわからないんじゃないかと。

java

1 // カンマ区切りでListに入れる? 2 String[] data = s.split(","); // カンマ区切りを配列にする 3 Student student = new Student(data[0], data[1]); 4 Subject subject = new Subject(data[2], data[3]); // 知らんけど教科名と点数とか保持してるんか。 5 6 if(csvdata.contains(student)) { 7 csvdata.get(csvdata.indexOf(student)).add(subject); // 知らんけど、書いてないアクセッサーを使う 8 } else { 9 student.add(subject); 10 csvdata.add(student); 11 } 12

ちなみに、ListでなくnameをキーにMap使う方が楽だと思います。

投稿2020/05/08 01:35

momon-ga

総合スコア4826

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

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

退会済みユーザー

退会済みユーザー

2020/05/08 06:00

ありがとうございます。 ご教示いただいたかたちに添ってソースコードを書き直してみたところ、上手くStudentクラスとSubjectクラスにcsvファイルからデータを取得することができました。 もしよろしければ、ここから重複している生徒の名前を結合?するなどして(indexOfやcontainを積赤って見ていますがあまり良い結果は得られていないです)生徒一人一人のデータにしていきたいのですが、ご教示いただけますでしょうか。 すみません。言葉でうまく説明できないため先ほど載せたcvsファイルのサンプルを例に出して説明させていただきます。 1-1,山田太郎,国語,76 1-2,太田和弘,数学,87 1-1,伊藤淳,理科,65 1-1,斎藤博,社会,57 1-3,田中郁美,理科,59 1-1,山田太郎,数学,45 1-3,柳瀬徹,英語,58 1-2,彦坂直樹,社会,82 1-3,田中郁美,国語,87 となっている場合、山田太郎が複数回出ているので、最終的には 1-1,山田太郎,合計得点(Personクラスの点数の合計を算出するメソッドを使う),平均… というかたちに整えたいと考えています。
momon-ga

2020/05/08 06:06

当初の質問とかけ離れるようであれば、別途質問を立ててください。 ちょっとした違いであれば、コメントでなく質問に追記して問題点を明らかにしてください。
kazuma-s

2020/05/08 06:16

書き直したソースコードを示してください。元のコードだと、読み取りクラスがなんなのかが分からないし、Person と Studnet が混在しているし、Subjectクラスの定義もないし。
退会済みユーザー

退会済みユーザー

2020/05/08 06:21

やりたいことがここの質問の意図から少しそれる為、新しく質問を立てさせていただきます。 大変ありがたいアドバイスの数々、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問