java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

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

投稿日:

最終更新日:2016年07月27日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

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

処理の流れ

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

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

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

以下は、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句を書くと思います。