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

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

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

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

Q&A

1回答

609閲覧

ファイルからデータを表示して、そのデータを別のファイルに書き込みたい

abc0507

総合スコア0

Java

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

0グッド

1クリップ

投稿2022/10/23 06:34

前提

質問するのはもちろんのことプログラム自体初心者ですので、おかしな点が多々あると思いますがよろしくお願いします。

実現したいこと

商品コードを入力させる
個数を入力させる
入力された商品コードの商品と個数分の金額を”McdDate”と”McdDate4”から表示する
表示したものを"McdDate2に書き込む"

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

個数Exception in thread "main" java.lang.NumberFormatException: For input string: "[2, 4]" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) at java.base/java.lang.Integer.parseInt(Integer.java:668) at java.base/java.lang.Integer.parseInt(Integer.java:786) at McdSaleInput.main(McdSaleInput.java:78) 実行するとこういったエラーメッセージが表示されました

該当のソースコード

java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.io.FileWriter; 5import java.io.IOException; 6import java.io.PrintWriter; 7import java.util.ArrayList; 8import java.util.List; 9import java.util.Scanner; 10 11public class McdSaleInput { 12 public static void main(String[] args) { 13 String inFilename = "McdDate.txt"; 14 String r = "McdDate4.txt"; 15 String outFilename = "McdDate2.txt"; 16 17 System.out.println("-------------------------------"); 18 System.out.println("     商品コード     "); 19 System.out.println("-------------------------------"); 20 try { 21 22 File file = new File("McdDate3.txt"); 23 24 FileReader fileReader = new FileReader(file); 25 int data; 26 while ((data = fileReader.read()) != -1) { 27 System.out.print((char) data ); 28 } 29 30 fileReader.close(); 31 32 } catch (IOException e) { 33 e.printStackTrace(); 34 } 35 System.out.println("-----------------------------------------"); 36 System.out.println("【販売する商品コードを入力してください】"); 37 System.out.println("【終了する場合は0を押してください】"); 38 List<Integer> nums = new ArrayList<>(); 39 List<Integer> abc=new ArrayList<>(); 40 try(Scanner scanner = new Scanner(System.in);) { 41 int v; 42 int y; 43 while(true) { 44 v = scanner.nextInt(); 45 System.out.print(" 個数"); 46 if(v <= 0) break; 47 y= scanner.nextInt(); 48 49 50 nums.add(v); 51 abc.add(y); 52 53 54 } 55 } 56 57 if(nums.size() == 0) { 58 System.out.print("エラーです"); 59 System.exit(0); 60 } 61 62 63 64 65 66 try(BufferedReader br = new BufferedReader(new FileReader(inFilename)); 67 BufferedReader m = new BufferedReader(new FileReader(r)); 68 PrintWriter u = new PrintWriter(new FileWriter(outFilename)); 69 PrintWriter pw = new PrintWriter(new FileWriter(outFilename));) { 70 String line; 71 String d; 72 73 for(int i=1; (line=br.readLine()) != null; i++) 74 for(int j=1; (d=m.readLine()) != null; j++){ 75 if(nums.contains(i)) 76 if(nums.contains(j)){ 77 int num = Integer.parseInt(d); 78 int w = Integer.parseInt(abc.toString()); 79 int nh = num * w; 80 System.out.println(line+nh ); 81 82 pw.println(line); 83 84 } 85 } 86 87 System.out.print("を販売しました"); 88 } catch(IOException e) { 89 e.printStackTrace(); 90 System.exit(1); 91 92 } 93 } 94} 95

試したこと

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

【McdDate.txt】ビックマック
てりやきマックバーガー
チキンフィレオ
エビフィレオ
月見バーガー(期間限定)
チキンマックナゲット5個
ハッシュポテト
マックフライポテト(S)
マックフライポテト(M)
マックフライポテト(L)
コカ・コーラ(S)
コカ・コーラ(M)
コカ・コーラ(L)
ファンタメロン(M)
Qooすっきり白ブドウ(M)
アイスティ(M)
プレミアムローストコーヒー(S)
【McdDate4.txt】
410
370
380
400
360
200
140
160
290
240
100
220
250
220
220
220
100

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

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

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

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

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

jimbe

2022/10/23 07:42

エラーメッセージに、問題の内容、発生個所等が書かれています。 >商品コードを入力させる >個数を入力させる お作りになったプログラムがどんな入力に対応しているのかは、作った本人が一番分かっていなければなりません。 scanner.nextInt() は、 "[2, 4]" という入力は処理できません。
jimbe

2022/10/23 07:48

ご質問で言及されていない McdDate3.txt をいうファイルをコードが扱っていますが、これは何でしょうか。
abc0507

2022/10/23 08:06

【McdDate3.txt】の中身は ビックマック,410円は1 てりやきマックバーガー,370円は2 チキンフィレオ,380円は3 エビフィレオ,400円は4 月見バーガー(期間限定),360円は5 チキンマックナゲット5個,200円は6 ハッシュポテト,140は7 マックフライポテト(S),160円は8 マックフライポテト(M),290円は9 マックフライポテト(L),240円は10 コカ・コーラ(S),100円は11 コカ・コーラ(M),220円は12 コカ・コーラ(L),250円は13 ファンタメロン(M),220円は14 Qooすっきり白ブドウ(M),220円は15 アイスティ(M),220円は16 プレミアムローストコーヒー(S),100円は17 プレミアムローストコーヒー(M),150円は18 で商品コードの入力の際にわかりやすいようにと思い作成したものです。
abc0507

2022/10/23 08:14

自分なりのエラーメッセージの解釈なのですが、scanner.nextInt() は"[2, 4]" を処理できないため 67行目のBufferedReader m = new BufferedReader(new FileReader(r));と 78行目のint w = Integer.parseInt(abc.toString());にエラーが生じた。 scanner.nextInt() を"[2, 4]" に対応して処理できる形に修正すれば実行できますでしょうか。
jimbe

2022/10/23 09:30 編集

>【McdDate3.txt】の中身は 商品名は McdDate.txt に入っていますし、 単価は McdDate4.txt に入っているのですよね。 その上で McdDate3.txt にまた商品名や単価を書いているのですか。 それでは商品名が変わったり新製品の追加、既存商品の廃止、価格改定の際は全てのファイルを同じに修正しなければなりません。 しかしそれでは間違いが入る可能性が増えます。現に "プレミアムローストコーヒー(M)" は McdDate.txt にありませんね? (計算用の単価ファイルの書き換えで1行位置を間違えただけで後で大変なことになります。) そのような場合はコード・商品名・単価を CSV 等の一行として1つのファイルにし、表示にも計算等にもそれのデータを(必要に応じてフォーマットして)用いるのが常です。 なぜ "[2, 4]" と入力したのでしょう。 仕様として "[2, 4]" と入力しなければならないと決まっているのでしょうか。
abc0507

2022/10/23 09:10

なるほど、こんなにファイルを作成する必要はないんですね。了解しました。 このプログラムを実行して個数を入力する時になぜ[2,4]と入力したかと言うことですか。
episteme

2022/10/23 09:11

> 【McdDate3.txt】の中身は ビックマック,410円は1 てりやきマックバーガー,370円は2 チキンフィレオ,380円は3 エビフィレオ,400円は4 たとえば チキンフィレオ を4つ欲しいなら 3 4 と入力するん?  [3,4] と入力するん? それともほかのなにか? なんにせよ、その入力から 二つのint値: 3 と 4 を取り出さにゃならんけど、 その部分はどこ? それは正しい?
jimbe

2022/10/23 09:41

>なぜ[2,4]と入力したか scanner.nextInt は、スペースやタブを区切りとする数字列の入力を数値に変換します。従って、まず数字で無ければ例外を発しますし、"," 区切りのつもりとして入力しても同様です。 とこかの他のシステムで「2つの値を入力するときは "[2,4]" のようにする」という経験があって、java でも同じだろうとされたのであれば、残念ながらそうではありません、ということになります。 逆にこのプログラムはコード・個数の入力は「"[2,4]"のように"[]"で囲み","で区切って入力することに決まっている」ということであれば、 scanner.nextInt では無い他の方法で入力を解析しなければなりません。
guest

回答1

0

McdDate.txt/McdDate3.txt/McdDate4.txt に散らばるデータを McdMaster.csv に纏めました。

java

1import java.io.*; 2import java.util.*; 3 4public class McdSaleInput { 5 public static void main(String[] args) throws IOException { 6 Map<Integer,Master> masterMap = readMaster("McdMaster.csv"); 7 8 printProduct(masterMap); 9 10 List<Input> inputList = 入力(); 11 if(inputList.size() == 0) { 12 System.out.print("エラーです"); 13 System.exit(0); 14 } 15 16 出力(masterMap, inputList, "McdData2.txt"); 17 } 18 19 private static void printProduct(Map<Integer,Master> masterMap) { 20 System.out.println("-------------------------------"); 21 System.out.println("     商品コード     "); 22 System.out.println("-------------------------------"); 23 for(Map.Entry<Integer,Master> entry : masterMap.entrySet()) { 24 System.out.println(entry.getValue().toString()); 25 } 26 } 27 28 private static class Master { 29 final int code; 30 final String name; 31 final int unitprice; 32 Master(int code, String name, int unitprice) { 33 this.code = code; 34 this.name = name; 35 this.unitprice = unitprice; 36 } 37 @Override 38 public String toString() { 39 return name + "," + unitprice + "円は" + code; 40 } 41 } 42 43 private static Map<Integer,Master> readMaster(String filename) throws IOException { 44 Map<Integer,Master> masterMap = new TreeMap<Integer,Master>(); 45 46 try(BufferedReader reader = new BufferedReader(new FileReader(filename))) { 47 for(String line; (line = reader.readLine()) != null; ) { 48 String[] tokens = line.split(","); 49 if(tokens.length != 3) throw new IOException(filename + " format error: line=" + line); 50 try { 51 int code = Integer.parseInt(tokens[0]); 52 String name = tokens[1]; 53 int unitprice = Integer.parseInt(tokens[2]); 54 masterMap.put(code, new Master(code, name, unitprice)); 55 } catch(NumberFormatException e) { 56 throw new IOException(filename + " format error: line=" + line, e); 57 } 58 } 59 } 60 61 return masterMap; 62 } 63 64 private static class Input { 65 final int code, number; 66 Input(int code, int number) { 67 this.code = code; 68 this.number = number; 69 } 70 } 71 72 private static List<Input> 入力() { 73 System.out.println("-----------------------------------------"); 74 System.out.println("【販売する商品コードと個数を入力してください】"); 75 System.out.println("【終了する場合は0を入力してください】"); 76 77 List<Input> inputList = new ArrayList<>(); 78 79 try(Scanner scanner = new Scanner(System.in)) { 80 while(true) { 81 System.out.print("コード: "); 82 int code = scanner.nextInt(); 83 if(code <= 0) break; 84 85 System.out.print("個数: "); 86 int number = scanner.nextInt(); 87 88 inputList.add(new Input(code, number)); 89 } 90 } 91 92 return inputList; 93 } 94 95 private static void 出力(Map<Integer,Master> masterMap, List<Input> inputList, String filename) throws IOException { 96 try(PrintWriter writer = new PrintWriter(new FileWriter(filename))) { 97 for(Input input : inputList) { 98 Master master = masterMap.get(input.code); 99 StringBuilder sb = new StringBuilder() 100 .append(master.name).append(" ") 101 .append(input.number).append("個 ") 102 .append(master.unitprice * input.number).append("円"); 103 System.out.println(sb.toString()); 104 writer.println(sb.toString()); 105 } 106 } 107 System.out.print("を販売しました"); 108 } 109}

McdMaster.csv

plain

11,ビックマック,410 22,てりやきマックバーガー,370 33,チキンフィレオ,380 44,エビフィレオ,400 55,月見バーガー(期間限定),360 66,チキンマックナゲット5個,200 77,ハッシュポテト,140 88,マックフライポテト(S),160 99,マックフライポテト(M),290 1010,マックフライポテト(L),240 1111,コカ・コーラ(S),100 1212,コカ・コーラ(M),220 1313,コカ・コーラ(L),250 1414,ファンタメロン(M),220 1515,Qooすっきり白ブドウ(M),220 1616,アイスティ(M),220 1717,プレミアムローストコーヒー(S),100 1818,プレミアムローストコーヒー(M),150

実行結果

plain

1------------------------------- 2     商品コード      3------------------------------- 4ビックマック,410円は1 5てりやきマックバーガー,370円は2 6チキンフィレオ,380円は3 7エビフィレオ,400円は4 8月見バーガー(期間限定),360円は5 9チキンマックナゲット5個,200円は6 10ハッシュポテト,140円は7 11マックフライポテト(S),160円は8 12マックフライポテト(M),290円は9 13マックフライポテト(L),240円は10 14コカ・コーラ(S),100円は11 15コカ・コーラ(M),220円は12 16コカ・コーラ(L),250円は13 17ファンタメロン(M),220円は14 18Qooすっきり白ブドウ(M),220円は15 19アイスティ(M),220円は16 20プレミアムローストコーヒー(S),100円は17 21プレミアムローストコーヒー(M),150円は18 22----------------------------------------- 23【販売する商品コードと個数を入力してください】 24【終了する場合は0を入力してください】 25コード: 2 26個数: 2 27コード: 8 28個数: 2 29コード: 16 30個数: 1 31コード: 18 32個数: 1 33コード: 0 34てりやきマックバーガー 2個 740円 35マックフライポテト(S) 2個 320円 36アイスティ(M) 1個 220円 37プレミアムローストコーヒー(M) 1個 150円 38を販売しました

実行後 McdData2.txt

plain

1てりやきマックバーガー 2個 740円 2マックフライポテト(S) 2個 320円 3アイスティ(M) 1個 220円 4プレミアムローストコーヒー(M) 1個 150円

投稿2022/10/23 09:15

編集2022/10/23 09:25
jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問