こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

カンマ区切りの数値を合計する

こんにちは。「Javaを復習する初心者」です。今回はカンマ区切りで整数値が記入されているテキストファイルを読み込んで合計を出す練習をしました。

大まかに述べると以下のようなプログラムです。

  • resource/sample.txtを読み込む。
  • 空行は無視
  • 未入力箇所も無視(1,,2となってる場合の箇所)

ファイルの置く場所ですが、Eclipseなのでプロジェクトの直下からの相対パスが使えるようです。なのでプロジェクト直下に「resource」フォルダを作成し、その中に「sample.txt」を作成しました。これで「File file = new File(“resource/sample.txt”)」と書けばファイルが取得できます。

以下は、sample.txtの内容です。空行と未入力箇所を含めるようにしました。

1,2

10,20,30

1,,1000

プログラム

合計を出力する処理ですが、大体次の手順です。

  1. int型変数totalを宣言し、0で初期化する。
  2. ファイルの最後まで以下を繰り返す。
    1. 一行読む。
    2. 空行ならスキップ
    3. 空行でない場合、String#splitメソッドでカンマで分割。
    4. 分割したものそれぞれについて、空文字でないなら変数totalに加算する。

以下はソースと実行結果です。

package practice;

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

public class Hello20160727 {

    public static void main(String[] args) {

        File file = new File("resource/sample.txt");
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            String line = null;
            int total = 0;
            while ((line = br.readLine()) != null) {

                // 空行はスキップ
                if (line.isEmpty()) {
                    continue;
                }

                // 空行でない場合、合計する。
                String[] nums = line.split(",");
                for (String num : nums) {
                    if (!num.isEmpty()) {
                        total += Integer.parseInt(num);
                    }
                }
            }
            System.out.println(total);
        } catch (FileNotFoundException e) {
            System.out.println("ファイルが存在しません。");
        } catch (IOException e) {
            System.out.println("エラーが発生しました。");
        }

    }

}
1064

解説

なぜtry-catch節があるかというと、以下のように検査例外をスローするメソッドがあるからです。

  • new FileReader(file)の箇所: FileNotFoundException
  • br.readLine()の箇所: IOException

FileNotFoundExceptionの処理は書かなくてもコンパイルはできますが、念のため書きました。new FileReader(file)がtry-with-resources文でtryの直後に書いてあるためコンパイルエラーは出ないようです。

BufferedReaderのclose処理が書いてありませんが、try-with-resources文を使っているため、close処理の記述は省略できます。通常のtry-catchならfinally句を書くと思います。