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

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

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

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

Q&A

解決済

1回答

809閲覧

テキストファイルからScanner, Stringへの出力

KttShK

総合スコア9

Java

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

0グッド

0クリップ

投稿2020/01/30 04:14

編集2020/01/30 16:54

Javaの初心者です。

ファイルを読み込んで、Scanner,Stringへ出力するようなプログラムを作ってみたのですが、ファイル内容をきちんと抽出できておりません。
以下のように作っているのですが、問題個所を特定できていません。

アドバイスよろしくお願いいたします。

【想定】
car.txtファイルの情報(「car,car2,car3,car4」)をString"strTest"へ、
”Car2”をStringBuilder"sb"に格納したい。
【実態】
String”strTest”には以下Messageが格納され、”sb”には”,”が入っております。
java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=,][decimal separator=.][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\QNaN\E][infinity string=\Q?\E]

【アドバイス依頼内容】
String”strTest”に”car,car2,car3,car4”を格納したいのですが、
現状のコードは以下です。こちらで取れると思っていますが、上記のような実態となっており、できません。足りない部分があればアドバイスいただければ幸甚です。

また、”sb”においては”Car2”の次である”,”が入っております。If条件を”Car2”の一つ手前にすることで今のコードのままでも”Car2"を”sb”に格納できますが、条件を変えずに”Car2”をAppendする方法があればご教示いただければ幸甚です。

ここに言語を入力

try{ FileWriter fw = new FileWriter("C:\User\car.txt",false); PrintWriter pw = new PrintWriter(new BufferedWriter(fw)); pw.println(”car, car2 , car3, car4"); pw.close(); }catch (IOException ex){ ex.printStackTrace(); } File file = new File("C:\User\car.txt"); Scanner scan = null; try{ scan = new Scanner(file); }catch(FileNotFoundException e){ e.printStackTrace(); } StringBuilder sbtest = new StringBuilder(); sbtest.append(scan); String strTest = sbtest.toString(); System.out.println(strTest);      StringBuilder sb = new StringBuilder();      while(scan.hasNext()){   if(scan.next().equals("car2")){ sb.append(scan.next()+" "); }else{}

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

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

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

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

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

riko111

2020/01/30 04:26

エラーメッセージなどは出ていないのでしょうか?
KttShK

2020/01/30 04:34

返信ありがとうございます。この後にwhile(scan.hasNext()){にて値を取り出そうとする文をいれてましたが、そこでNullPointが出てしまします。 デバッグモードにして、確認したところしかるべき値が入っていませんでしたのでご照会させていただきました。
riko111

2020/01/30 04:36

エラーが出ている行があるならそれをちゃんと記述した上で、出ているエラーメッセージも出しましょう。
KttShK

2020/01/30 04:46

ご指摘ありがとうございます。更新させていただきました。
guest

回答1

0

ベストアンサー

ファイルに書き込みをする際には
FileWriter fw = new FileWriter("C:\User\car.txt",false);
で、ファイルのパスまで指定をしているのに、
読み込む際には
File file = new File("car.txt");
となっているのが原因ですね。

追記
Scannerは、入力した文字が格納されているものではなく、入力を先頭から解析していくためのものです。
なので、入力した文字はnextメソッドを使って取得することになります。
なので、「入力した全部の内容」と「個別の内容」が必要なら、繰り返して読み込みながら全部を格納する変数と個別に受け取る変数とにそれぞれ格納しないといけないです。

また、条件を「今取得したもの」で行いたいなら、nextメソッドを使わずに判定すれば良いだけです。

回答のコメントに書きましたが、ファイル内のデータが「str , str2 , str3 , str4」と、カンマの前後にスペースが入っているという形に直してもらったと仮定して書くと、

Java

1 2while(scan.hasNext()) { 3 String str = scan.next(); 4 sbtest.append(str); 5 if(str.equals("car2")) { 6 sb.append(str); 7 } 8} 9

のような形に書けますね。

投稿2020/01/30 04:40

編集2020/01/30 22:42
riko111

総合スコア149

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

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

KttShK

2020/01/30 04:54

読み込む際もFile file = new File("C:\User\car.txt");"記載するということでしょうか? トライしてみたところ、エラーは出なくなりましたが、Stringには以下情報が入るようになりました。 java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\,][decimal separator=.][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\QNaN\E][infinity string=\Q?\E] 期待値としては「”car, car2 , car3, car4"」が入る予定でしたが 何か記述を間違えていたりしていますでしょうか?
riko111

2020/01/30 04:58

ここで出ているのは sbtest.append(scan); String strTest = sbtest.toString(); System.out.println(strTest); の出力ですね。 肝心の、繰り返しの中でsbに格納している値を確認してください。
KttShK

2020/01/30 05:19

sbには「", "」が入っていました。「"Car2 "」をsbに格納したい場合 はどうすればよろしいでしょうか?ひとつ手前の「”Car,”」をIfの条件にして取得する以外に何か良い方法はあったりしますでしょうか? また、String strTestにも”car, car2 , car3, car4"を格納したい場合はどうすればよろしいでしょうか?
riko111

2020/01/30 05:32

そもそも、どういうふうに考えて(または調査して) if(scan.next().equals("car2")){ sb.append(scan.next()+" "); } を記述されたのでしょうか。 今のままでは、丸投げの質問だと思います。 また、最初の質問では、「car.txtファイルの情報(「car,car2,car3,car4」)をScan、Stringへ出力。」 と書かれていますが、 実際にやりたいことは、「Car2」と、「car, car2 , car3, car4」の2つを取り出したいということですか?
KttShK

2020/01/30 06:15

コメントありがとうございます。 記述は参考書をもとに自身で考えて記述しました。Appendの際にnext()を入れてしまったのでひとつ先の「","」が入ってしまったことに気づき、ひとつ前の「”Car1”」をIf条件に入れてみて確認したところ、Car2を格納することができたのですが、Car2の条件のまま行うにはどうすればよいか気になり、参考書およびネットの情報を調べてみましたが、適切な情報を参照することができなかったのでご照会させていただきました。 StringBuilderには「Car2」、Stringには「car, car2 , car3, car4」を取り出したかった次第です。
riko111

2020/01/30 06:31

多分コードをまた修正されたと思うので、こちらの投稿も直してください。 その際、コード部分は選択してエディタ画面の<code>ボタンをクリックして、読みやすくなるようにしてください。それで整理しましょう。
KttShK

2020/01/30 16:55

ありがとうございます。修正ならびにコードにおいては読みやすくなるようにいたしました。
riko111

2020/01/30 22:44 編集

色々直していただいてありがとうございます。 <code>ボタンをクリックした際は、「ここに言語を入力」のところは言語名(ここではJava)に変えてください。 ところで、ファイルに追加している文字列が 「”car, car2 , car3, car4"」となっていて、 car2の後ろには,の前後に半角スペースが入っていますが、それ以外は,の後ろにしか入っていないのは理由がありますか? こういったデータだと、そのあたりは揃っているものではないかと思うのですが、理由がなければ揃えてもらって良いでしょうか。
KttShK

2020/01/31 06:37

ご回答どうもありがとうございました。よくわかりました! ファイルの文字列はこの部分だけあえて前後に半角スペースを入れています。 カンマだけでもきちんと読んで処理されることを確認したかった次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問