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

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

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

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

Q&A

解決済

2回答

21727閲覧

Javaでcsvファイルを編集して出力したい

yk-211

総合スコア34

Java

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

0グッド

0クリップ

投稿2015/05/23 21:15

タイトル通りですが、コーディングしたのですが、なかなか思い通りに行きません。
問題はこちらです。

下記部分をInput.csvとしてファイルを作成し、
英語の得点を全て+10した値を出力するファイル(Output.csv)を作成してください。
※ +10点した値が100点以上の場合、100点とする。
Input.csv


氏名,国語,数学,英語,理科,社会
荒垣人絵,65,71,74,82,97
今井里絵子,84,83,74,64,65
下原香子,74,74,78,80,78
嶋袋寛子,90,90,90,90,90
鈴木亜美,87,78,85,60,88
広末良子,93,95,94,92,95


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Csv1 {
private final static String inputCsvFile = "C:\JavaTest\test\input.csv";
private final static String outputCsvFile = "C:\JavaTest\test\output.csv";
private final static String ChangeScore = "74,74,78,90,85,94";
private final static String ChangedScore = "84,84,88,100,95,100";

public static void main(String[] args){ String line; String[] csvArray; File inputFile = new File(inputCsvFile); File outputFile = new File(outputCsvFile); BufferedReader in = null; BufferedWriter out = null; try { in = new BufferedReader(new FileReader(inputFile)); out = new BufferedWriter(new FileWriter(outputFile)); while ((line = in.readLine()) != null){ csvArray = line.split("\\,"); for(int i=0; i < csvArray.length; i++){ if(i != csvArray.length -1 ){ if(ChangeScore.equals(csvArray[i])){ csvArray[i] = ChangedScore; out.write(csvArray[i]); out.write(","); }else{ out.write(csvArray[i]); out.write(","); } } else{ out.write(csvArray[i]); } } out.newLine(); } }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }finally{ try{ if (in != null){ in.close(); } if(out != null){ out.close(); } }catch(IOException e){ System.out.println("close fail"); e.printStackTrace(); } } }

}

とコーディングしてみましたが、間違っているところだらけです・・・
添削いただけないでしょうか。宜しくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2015/05/23 23:11

おもしろそうなのでやってみますね。 とりあえずパッとみてわかることとしては、 private final static String ChangeScore = "74,74,78,90,85,94"; private final static String ChangedScore = "84,84,88,100,95,100"; の2行は不要です。 1行目はCSV(inファイル)から読みこむ値です。 2行目はCSV(outファイル)に出力する値です。……よね? ですからこの2行を書いてしまうのはまずいです。
guest

回答2

0

lang

1import java.io.BufferedReader; 2import java.io.BufferedWriter; 3import java.io.File; 4import java.io.FileReader; 5import java.io.FileWriter; 6import java.io.IOException; 7 8public class Csv1 { 9 10 private final static String inputCsvFile = "input.csv"; 11 private final static String outputCsvFile = "output.csv"; 12 13 public static void main(String[] args) { 14 String line; 15 String[] csvArray; 16 File inputFile = new File(inputCsvFile); 17 File outputFile = new File(outputCsvFile); 18 BufferedReader in = null; 19 BufferedWriter out = null; 20 21 try { 22 int line_num = 0; 23 in = new BufferedReader(new FileReader(inputFile)); 24 out = new BufferedWriter(new FileWriter(outputFile)); 25 while ((line = in.readLine()) != null) { 26 csvArray = line.split("\\,"); 27 line_num++; 28 if (line_num > 1) { 29 int v = Integer.parseInt(csvArray[3]); 30 csvArray[3] = "" + Integer.min(100, v + 10); 31 } 32 out.write(String.join(",", csvArray)); 33 out.newLine(); 34 } 35 } catch (IOException | NumberFormatException ex) { 36 ex.printStackTrace(); 37 } finally { 38 try { 39 if (in != null) { 40 in.close(); 41 } 42 if (out != null) { 43 out.close(); 44 } 45 } catch (IOException e) { 46 System.out.println("close fail"); 47 e.printStackTrace(); 48 } 49 } 50 } 51}

input.csv と out,pub.csv を vimdiff で比較した結果:
![イメージ説明]WIDTH:579

投稿2015/05/24 04:29

katoy

総合スコア22324

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

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

yk-211

2015/05/24 12:45

大変ありがとうございます。 とても綺麗なコードで、自分も書けるように 頑張ります!
guest

0

ベストアンサー

![イメージ説明]WIDTH:600こんな感じでしょうか……。
処理を追加した部分にコメントを入れてみました。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Csv1 {
private final static String inputCsvFile = "C:\JavaTest\test\input.csv";
private final static String outputCsvFile = "C:\JavaTest\test\output.csv";
// private final static String ChangeScore = "74,74,78,90,85,94";
// private final static String ChangedScore = "84,84,88,100,95,100";

public static void main(String[] args){ String line; String[] csvArray; File inputFile = new File(inputCsvFile); File outputFile = new File(outputCsvFile); BufferedReader in = null; BufferedWriter out = null; int lineCount = 0; // 何行目を処理しているのかを保持する変数 try { in = new BufferedReader(new FileReader(inputFile)); out = new BufferedWriter(new FileWriter(outputFile)); while ((line = in.readLine()) != null){ csvArray = line.split("\\,"); for(int i=0; i < csvArray.length; i++){ if(i != csvArray.length -1 ){ if(lineCount != 0){// 1行目はタイトルなので処理しない。 if(i == 3){ // iが3のときが英語の処理(英語は4列目だけど、Javaでは0スタートなので) String tempPoint = csvArray[3]; // 4列目(英語)の得点を取得 int intPoint = Integer.parseInt(tempPoint); // Stringなのでintになおす intPoint = intPoint +10; // 10点足す if(intPoint >= 100){ // 100点を超えてしまったら100点になおす intPoint = 100; } csvArray[3] = Integer.toString(intPoint); // 4列目(英語)の得点に詰め直す } } System.out.println("count:"+lineCount + " "+csvArray[i]); out.write(csvArray[i]); out.write(","); }else{ out.write(csvArray[i]); out.write(","); } } lineCount = lineCount + 1; out.newLine(); } }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }finally{ try{ if (in != null){ in.close(); } if(out != null){ out.close(); } }catch(IOException e){ System.out.println("close fail"); e.printStackTrace(); } } }

}

投稿2015/05/23 23:43

編集2015/05/23 23:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yk-211

2015/05/24 11:32

回答誠にありがとうございます! 実際に直してみたら同じようになりました! ありがとうございます!
退会済みユーザー

退会済みユーザー

2015/05/24 12:21

お役に立てたのならは良かったです。 今回わたしが書いたプログラムはyk-211さんのプログラムを出来る限り"活かす"かたちで書いています。 もしお時間があれば↓で回答くださっている katoy さんの方法も試してみてください。 (katoyさんのソースコードのほうが奇麗です!)
yk-211

2015/05/24 12:44

まだまだJavaを初めたばかりで綺麗なコードは書けないですが、いずれは かけるように努力します! あともう1つお聞きしてよろしいでしょうか? 下記のクラスCalculate.javaに平均点を求めるメソッドを1つ作成してください。 ※ 成績の2次元配列は変更しないでください。 ※ ループさせるのはlengthを利用してください。 ※ 個人の平均点と科目の平均点の場合分けを行ってください。 成績は上記のInput.csvを使用する。 これを綺麗に書くとなればどんなふうになりますか? 時間があればよろしくお願いいたします。 public class Calculate{ String Add(int a, int b) { return String.valueOf(a+b); } String subtract(int a,int b){ return String.valueOf(a-b); } String multiply(int a,int b){ return String.valueOf(a*b); } String divide(int a,int b){ return String.valueOf(a/b); } public static void main (String[] args) { Calculate calc = new Calculate(); System.out.println(calc.Add(4, 2)); System.out.println(calc.subtract(4, 2)); System.out.println(calc.multiply(4, 2)); System.out.println(calc.divide(4, 2)); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問