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

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

ただいまの
回答率

90.84%

  • Java

    12879questions

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

  • Eclipse

    1573questions

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

  • CSV

    565questions

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

Javaのオブジェクト指向でcsvファイルを読み込み、新たなcsvファイルに出力する時のエラー

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 158

ranranway

score 196

 前提・実現したいこと

参考資料に記載されているコードを元に
Javaのオブジェクト指向で書かれたプログラムで
csvファイルを読み込み形式はそのままで新たなcsvファイルを
書き出そうとしています。

コピーではなく、
そのままの形式で一度オブジェクトのメンバとした
上で新たなcsvファイルに出力しようとしています。

参考資料
入力はexcelで作成したものをcsvファイルにした
item.csv
入力

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

String型におけるエラーが発生しています。
以下のエラーをなくすにはどのようにコードを修正すべきでしょうか。

Exception in thread "main" java.lang.NumberFormatException: For input string: "りんご"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at csvTest.main(csvTest.java:39)

 該当のソースコード

csvTestクラス

//Java.ioパッケージ
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class csvTest {

    public static void main(String[] args, BufferedReader outputLine) {
        List<Item> itemList = new ArrayList<Item>(); //データ格納用リスト
        String input = "item.csv";//String型でファイル名を指定する
        String output = "itemOut.csv";

        try {
            BufferedReader InputLine = new BufferedReader(new FileReader(input));
            PrintWriter outputLine1 = new PrintWriter(new FileWriter(output));
            String line;

            line = InputLine.readLine(); //ヘッダを読み込む
            outputLine1.println(line); //ヘッダを書き込む

            //1行ずつ読み込み
            while ((line = InputLine.readLine()) != null) { //String変数lineに格納
                StringTokenizer st = new StringTokenizer(line); //lineを分割の対象にする

                Item item = new Item(); //Itemクラスのインスタンスを作成
                //フィールドの設定を行う
                //String型をInteger型に変更
                /*
                item.setName(Integer.parseInt(st.nextToken(",")));
                item.setProductarea(Integer.parseInt(st.nextToken(",")));
                  */              item.setproducer_id(Integer.parseInt(st.nextToken(",")));

                itemList.add(item); //リストに追加する
            }

            //itemListの中身を順に出力する
            for (Item item : itemList) {
                outputLine.print(item.getName() + ",");
                outputLine.print(item.getProductarea() + ",");
                outputLine.print(item.getProducer() + ",");
                outputLine.println();
            }
            //開いていた出入力ファイルを閉じる
            InputLine.close();
            outputLine.close();

        } catch (IOException e) {
            System.out.println("ファイルが開けません");
        }
    }

}

Itemクラス

public class Item {
    //フィールド
    //メンバはprivate, メソッドはpublic
    private String name;
    private String area;
    private String producer_id;

    //メンバにはgetter, setterメソッドでアクセスする
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getProductarea() {
        return area;
    }

    public void setProductarea(String area) {
        this.area = area;
    }

    public int getProducer() {
        return producer;
    }

    public void setProducer(int producer_id) {
        this.producer_id = producer_id;
    }
}

試したこと

csvTestクラスを以下のようにコメントアウトしたところ、

 /*
                item.setName(Integer.parseInt(st.nextToken(",")));
                item.setProductarea(Integer.parseInt(st.nextToken(",")));
                       item.setproducer_id(Integer.parseInt(st.nextToken(",")));
     */    


出力がすべてnullと0になりました。
itemOut.csv
イメージ説明

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

Eclipse Java EE IDE for Web Developers.
Version: Oxygen.3a Release (4.7.3a)

Microsoft Excel for Mac バージョン16.13

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

//1行ずつ読み込み
while ((line = InputLine.readLine()) != null) { //String変数lineに格納
    StringTokenizer st = new StringTokenizer(line); //lineを分割の対象にする

    Item item = new Item(); //Itemクラスのインスタンスを作成
    //フィールドの設定を行う
    //String型をInteger型に変更
    /*
    item.setName(Integer.parseInt(st.nextToken(",")));
    item.setProductarea(Integer.parseInt(st.nextToken(",")));
      */              item.setproducer_id(Integer.parseInt(st.nextToken(",")));

↑csvファイルの1行目は、項目名が書かれたヘッダ部やろ!

数値に変換できるはずないでぇ!!!

追記:

private String name;
private String area;
private String producer_id;

↑これらのフィールドはItemインスタンスを作成した時点で、すべて初期値nullです。
setter部分をすべてコメントアウトしているのだから当然の結果です。

プログラムは書いたようにしか動きません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/23 13:43

    1行目はcontinueで読み飛ばしぃ!

    キャンセル

  • 2018/05/23 13:47

    ああ、エラー箇所はコメントアウトしてたのねー

    キャンセル

  • 2018/05/23 13:52

    ご指摘いただきましてありがとうございます。
    その点を変更させていただいた上で、実行させていただくと、

    キャンセル

  • 2018/05/23 13:59

    試したことに追記させていただいたように
    null値と0が出力されてしまいます。これはまた別の問題でしょうか。

    キャンセル

  • 2018/05/23 14:24

    「item.setproducer_id(Integer.parseInt(st.nextToken(",")))」ついでに言えば、こんなメソッドは未定義なので、コンパイルできるはずがない。

    キャンセル

+1

    public void setProducer(int producer_id) {
        this.producer_id = producer_id;
    }


this.producer_id って、Stringじゃないの?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/23 13:48

    ご回答いただきましてありがとうございます。
    この点に関してですが、excelでcsvファイルを作った時に半角数字で「1」を入力するとcsv上ではStringになっているのか、integerになっているのかわからずintとしておきました。Stringが正しいのでしょうか。

    キャンセル

  • 2018/05/23 13:54

    このコードの通りならそもそもコンパイルエラーが出るはずだけど。

    そもそも、CSVにした時点ですべて文字列となってます
    それを int にしたいなら、変換する必要があります

    なにをどうしたいか、というのはあなたの自由ですんで、好きに決めましょう。
    だけど、プログラムのルールを破るようなコードは組めませんぜ

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Javaの質問です。テキストファイルのデータを上書き(部分的に削除)したいです。お力をお貸しください...

    初めて利用させていただきます。 現在私は、テキストファイルを用いるJavaの勉強をしております。 テキストファイルに、コンソールで入力した「name」「job」「sex」を

  • 解決済

    javaでデータを読み込んでソートしたいのですがうまく来ません

    コンパイルするとエラーになって 「シンボルが見つかりません」と表示されます。 他にも問題があれば教えてください import java.io.File; import

  • 受付中

    計算機の機能追加に関する質問

    javaで計算機のプログラムを作成しました。 単項マイナス演算(例、-10+5)を行う処理を追加したいのですが 修正方法がわかりません。 どのように修正したらよいでしょうか?

  • 解決済

    類似度を使ったクラスタリング法

    実現したいこと IaaSクラウドオントロジクラスタリングに関するシステムを作っています 要素(elem)と要素(elem) 要素(elem)とクラスタ(cluster)

  • 受付中

    3つの整数が

    public class Main { public static void main(String[] args) throws Exception { //3つの整数が入力

  • 解決済

    ファイル読み込み、ソート

    前提・実現したいこと avaを使用しております。 プログラムの引数で入力ファイルを読み込む。ただし、入力ファイルにはコンマ区切りで学生番号、氏名、国語の点、英語の点、数学の点が

  • 解決済

    ファイルの書き出し

    前提・実現したいこと csvファイルから読み込んだものをソートして別のcsvファイルに書き出しを行いたいです。 発生している問題・エラーメッセージ 書き出しが行われない。

  • 解決済

    CSVファイルのデータ集計

    前提・実現したいこと javaでCSVファイルのデータを読み込み、カテゴリ別に価格の総合を計算し、その結果を画面に出力し、CSVファイルで保存したいです。 CSVファイルの読み

同じタグがついた質問を見る

  • Java

    12879questions

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

  • Eclipse

    1573questions

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

  • CSV

    565questions

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

  • トップ
  • Javaに関する質問
  • Javaのオブジェクト指向でcsvファイルを読み込み、新たなcsvファイルに出力する時のエラー