Java – CSVファイルを読み込む方法を初心者向けに解説
JavaでCSVファイルを読み込むには、主にBufferedReaderを使用する方法や、外部ライブラリ(例: OpenCSV)を利用する方法があります。
BufferedReaderを使う場合、ファイルを1行ずつ読み取り、カンマで分割してデータを処理します。
外部ライブラリを使うと、CSVのパースやエスケープ処理が簡単になります。
初心者には、まずBufferedReaderで基本を学び、複雑な処理が必要な場合にライブラリを検討するのがおすすめです。
JavaでCSVファイルを読み込む基本的な方法
CSV(Comma-Separated Values)ファイルは、データをカンマで区切って保存するシンプルな形式です。
Javaでは、CSVファイルを読み込むためにいくつかの方法がありますが、ここでは基本的な方法を紹介します。
1. Java標準ライブラリを使用する方法
Javaの標準ライブラリを使ってCSVファイルを読み込む場合、BufferedReaderとFileReaderを利用します。
以下はそのサンプルコードです。
import java.io.BufferedReader; // バッファードリーダーをインポート
import java.io.FileReader; // ファイルリーダーをインポート
import java.io.IOException; // 入出力例外をインポート
public class App {
    public static void main(String[] args) {
        String csvFile = "data.csv"; // 読み込むCSVファイルのパス
        String line; // 行を格納する変数
        String delimiter = ","; // 区切り文字
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            while ((line = br.readLine()) != null) { // 行がnullでない限り繰り返す
                String[] values = line.split(delimiter); // 行を区切り文字で分割
                // 各値を表示
                for (String value : values) {
                    System.out.print(value + " "); // 値を表示
                }
                System.out.println(); // 改行
            }
        } catch (IOException e) { // 入出力例外をキャッチ
            e.printStackTrace(); // エラーメッセージを表示
        }
    }
}このコードでは、data.csvというファイルを読み込み、各行をカンマで分割して表示します。
BufferedReaderを使用することで、ファイルを効率的に読み込むことができます。
2. CSVファイルのサンプルデータ
以下は、data.csvのサンプルデータです。
| 名前 | 年齢 | 職業 | 
|---|---|---|
| 山田太郎 | 30 | エンジニア | 
| 佐藤花子 | 25 | デザイナー | 
| 鈴木一郎 | 40 | マネージャー | 
このデータを上記のコードで読み込むと、次のような出力が得られます。
名前 年齢 職業 
山田太郎 30 エンジニア 
佐藤花子 25 デザイナー 
鈴木一郎 40 マネージャー3. 注意点
- CSVファイルのパスは、実行環境に応じて適切に設定する必要があります。
 - 区切り文字がカンマ以外の場合は、
delimiterの値を変更してください。 - ファイルが存在しない場合や読み込み権限がない場合は、
IOExceptionが発生します。 
外部ライブラリを使ったCSVファイルの読み込み
JavaでCSVファイルを扱う際、外部ライブラリを使用することで、より簡単かつ効率的にデータを読み込むことができます。
ここでは、人気のあるライブラリであるApache Commons CSVを使用した方法を紹介します。
1. Apache Commons CSVの導入
Apache Commons CSVを使用するには、まずライブラリをプロジェクトに追加する必要があります。
Mavenを使用している場合、pom.xmlに以下の依存関係を追加します。
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.9.0</version> <!-- 最新のバージョンを確認してください -->
</dependency>Gradleを使用している場合は、build.gradleに以下を追加します。
implementation 'org.apache.commons:commons-csv:1.9.0' // 最新のバージョンを確認してください2. Apache Commons CSVを使ったCSVファイルの読み込み
以下は、Apache Commons CSVを使用してCSVファイルを読み込むサンプルコードです。
import org.apache.commons.csv.CSVFormat; // CSVフォーマットをインポート
import org.apache.commons.csv.CSVParser; // CSVパーサーをインポート
import org.apache.commons.csv.CSVRecord; // CSVレコードをインポート
import java.io.FileReader; // ファイルリーダーをインポート
import java.io.IOException; // 入出力例外をインポート
public class App {
    public static void main(String[] args) {
        String csvFile = "data.csv"; // 読み込むCSVファイルのパス
        try (FileReader reader = new FileReader(csvFile); // ファイルリーダーを作成
             CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader())) { // CSVパーサーを作成
            
            for (CSVRecord record : csvParser) { // 各レコードを繰り返す
                String name = record.get("名前"); // 名前を取得
                String age = record.get("年齢"); // 年齢を取得
                String occupation = record.get("職業"); // 職業を取得
                
                // 各値を表示
                System.out.println("名前: " + name + ", 年齢: " + age + ", 職業: " + occupation);
            }
        } catch (IOException e) { // 入出力例外をキャッチ
            e.printStackTrace(); // エラーメッセージを表示
        }
    }
}このコードでは、data.csvというファイルを読み込み、各レコードから名前、年齢、職業を取得して表示します。
Apache Commons CSVを使用することで、ヘッダーを簡単に扱うことができ、コードがシンプルになります。
3. CSVファイルのサンプルデータ
以下は、data.csvのサンプルデータです。
| 名前 | 年齢 | 職業 | 
|---|---|---|
| 山田太郎 | 30 | エンジニア | 
| 佐藤花子 | 25 | デザイナー | 
| 鈴木一郎 | 40 | マネージャー | 
このデータを上記のコードで読み込むと、次のような出力が得られます。
名前: 山田太郎, 年齢: 30, 職業: エンジニア
名前: 佐藤花子, 年齢: 25, 職業: デザイナー
名前: 鈴木一郎, 年齢: 40, 職業: マネージャー4. 注意点
- Apache Commons CSVを使用する場合、依存関係を正しく設定する必要があります。
 - ヘッダーが存在しないCSVファイルを扱う場合は、
CSVFormat.DEFAULT.withHeader()の部分を変更する必要があります。 - CSVファイルのパスは、実行環境に応じて適切に設定してください。
 
実践例:CSVファイルを読み込んでデータを処理する
CSVファイルを読み込んだ後、データを処理することは非常に重要です。
ここでは、CSVファイルから読み込んだデータを集計し、特定の条件に基づいてフィルタリングする実践例を紹介します。
1. CSVファイルのサンプルデータ
以下は、data.csvのサンプルデータです。
このデータには、名前、年齢、職業、給与が含まれています。
| 名前 | 年齢 | 職業 | 給与 | 
|---|---|---|---|
| 山田太郎 | 30 | エンジニア | 600000 | 
| 佐藤花子 | 25 | デザイナー | 400000 | 
| 鈴木一郎 | 40 | マネージャー | 800000 | 
| 田中健二 | 35 | エンジニア | 700000 | 
| 高橋美咲 | 28 | デザイナー | 450000 | 
2. CSVファイルを読み込んでデータを処理するサンプルコード
以下のコードでは、CSVファイルを読み込み、年齢が30歳以上の人の名前と給与を合計する処理を行います。
import org.apache.commons.csv.CSVFormat; // CSVフォーマットをインポート
import org.apache.commons.csv.CSVParser; // CSVパーサーをインポート
import org.apache.commons.csv.CSVRecord; // CSVレコードをインポート
import java.io.FileReader; // ファイルリーダーをインポート
import java.io.IOException; // 入出力例外をインポート
public class App {
    public static void main(String[] args) {
        String csvFile = "data.csv"; // 読み込むCSVファイルのパス
        int totalSalary = 0; // 給与の合計
        int count = 0; // 年齢が30歳以上の人数
        try (FileReader reader = new FileReader(csvFile); // ファイルリーダーを作成
             CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader())) { // CSVパーサーを作成
            
            for (CSVRecord record : csvParser) { // 各レコードを繰り返す
                int age = Integer.parseInt(record.get("年齢")); // 年齢を取得
                int salary = Integer.parseInt(record.get("給与")); // 給与を取得
                if (age >= 30) { // 年齢が30歳以上の場合
                    totalSalary += salary; // 給与を合計
                    count++; // 人数をカウント
                    System.out.println("名前: " + record.get("名前") + ", 給与: " + salary); // 名前と給与を表示
                }
            }
            // 年齢が30歳以上の人の給与の合計を表示
            System.out.println("年齢が30歳以上の人の給与の合計: " + totalSalary);
            System.out.println("年齢が30歳以上の人数: " + count);
        } catch (IOException e) { // 入出力例外をキャッチ
            e.printStackTrace(); // エラーメッセージを表示
        }
    }
}3. 出力結果
上記のコードを実行すると、次のような出力が得られます。
名前: 山田太郎, 給与: 600000
名前: 鈴木一郎, 給与: 800000
名前: 田中健二, 給与: 700000
年齢が30歳以上の人の給与の合計: 2100000
年齢が30歳以上の人数: 34. 解説
このコードでは、CSVファイルから年齢が30歳以上の人のデータをフィルタリングし、該当する人の名前と給与を表示しています。
また、該当する人の給与の合計と人数も計算しています。
これにより、データを効率的に処理し、必要な情報を抽出することができます。
5. 注意点
- CSVファイルのパスは、実行環境に応じて適切に設定する必要があります。
 - 年齢や給与のデータ型が異なる場合は、適切な型変換を行う必要があります。
 - データの整合性を保つために、CSVファイルのフォーマットを確認しておくことが重要です。
 
より効率的なCSVファイルの操作
CSVファイルを扱う際、効率的な操作を行うことで、パフォーマンスを向上させたり、コードを簡潔に保つことができます。
ここでは、CSVファイルの操作をより効率的に行うためのテクニックやベストプラクティスを紹介します。
1. ストリームAPIを使用する
Java 8以降、ストリームAPIを使用することで、データの処理をより簡潔に行うことができます。
以下は、CSVファイルをストリームで読み込み、特定の条件に基づいてフィルタリングする例です。
import org.apache.commons.csv.CSVFormat; // CSVフォーマットをインポート
import org.apache.commons.csv.CSVParser; // CSVパーサーをインポート
import org.apache.commons.csv.CSVRecord; // CSVレコードをインポート
import java.io.FileReader; // ファイルリーダーをインポート
import java.io.IOException; // 入出力例外をインポート
import java.util.stream.Stream; // ストリームをインポート
public class App {
    public static void main(String[] args) {
        String csvFile = "data.csv"; // 読み込むCSVファイルのパス
        try (FileReader reader = new FileReader(csvFile); // ファイルリーダーを作成
             CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader())) { // CSVパーサーを作成
            
            // ストリームを使用して年齢が30歳以上の人の名前を表示
            Stream<CSVRecord> stream = csvParser.getRecords().stream(); // レコードをストリームに変換
            stream.filter(record -> Integer.parseInt(record.get("年齢")) >= 30) // 年齢が30歳以上のフィルタ
                  .forEach(record -> System.out.println("名前: " + record.get("名前"))); // 名前を表示
            
        } catch (IOException e) { // 入出力例外をキャッチ
            e.printStackTrace(); // エラーメッセージを表示
        }
    }
}2. バッファリングを活用する
大きなCSVファイルを扱う場合、BufferedReaderを使用してファイルをバッファリングすることで、I/O操作の回数を減らし、パフォーマンスを向上させることができます。
以下はその例です。
import java.io.BufferedReader; // バッファードリーダーをインポート
import java.io.FileReader; // ファイルリーダーをインポート
import java.io.IOException; // 入出力例外をインポート
public class App {
    public static void main(String[] args) {
        String csvFile = "data.csv"; // 読み込むCSVファイルのパス
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) { // バッファードリーダーを作成
            String line; // 行を格納する変数
            while ((line = br.readLine()) != null) { // 行がnullでない限り繰り返す
                // 行の処理を行う
                System.out.println(line); // 行を表示
            }
        } catch (IOException e) { // 入出力例外をキャッチ
            e.printStackTrace(); // エラーメッセージを表示
        }
    }
}3. データのバリデーションを行う
CSVファイルから読み込んだデータは、必ずしも正しい形式であるとは限りません。
データのバリデーションを行うことで、エラーを未然に防ぐことができます。
以下は、年齢が正の整数であることを確認する例です。
import org.apache.commons.csv.CSVFormat; // CSVフォーマットをインポート
import org.apache.commons.csv.CSVParser; // CSVパーサーをインポート
import org.apache.commons.csv.CSVRecord; // CSVレコードをインポート
import java.io.FileReader; // ファイルリーダーをインポート
import java.io.IOException; // 入出力例外をインポート
public class App {
    public static void main(String[] args) {
        String csvFile = "data.csv"; // 読み込むCSVファイルのパス
        try (FileReader reader = new FileReader(csvFile); // ファイルリーダーを作成
             CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader())) { // CSVパーサーを作成
            
            for (CSVRecord record : csvParser) { // 各レコードを繰り返す
                String ageStr = record.get("年齢"); // 年齢を取得
                if (isValidAge(ageStr)) { // 年齢が有効か確認
                    System.out.println("有効な年齢: " + ageStr); // 有効な年齢を表示
                } else {
                    System.out.println("無効な年齢: " + ageStr); // 無効な年齢を表示
                }
            }
        } catch (IOException e) { // 入出力例外をキャッチ
            e.printStackTrace(); // エラーメッセージを表示
        }
    }
    // 年齢が正の整数か確認するメソッド
    private static boolean isValidAge(String ageStr) {
        try {
            int age = Integer.parseInt(ageStr); // 文字列を整数に変換
            return age >= 0; // 年齢が0以上か確認
        } catch (NumberFormatException e) { // 変換に失敗した場合
            return false; // 無効な年齢
        }
    }
}4. 注意点
- ストリームAPIを使用する際は、データのサイズに注意し、メモリ使用量を考慮する必要があります。
 - バッファリングを行うことで、I/O操作の効率が向上しますが、メモリ使用量が増加する可能性があります。
 - データのバリデーションは、データの整合性を保つために重要です。
 
適切なエラーハンドリングを行うことも忘れないようにしましょう。
まとめ
この記事では、Javaを使用してCSVファイルを読み込む方法について、基本的な手法から外部ライブラリを利用した効率的な操作まで幅広く解説しました。
特に、Apache Commons CSVを使ったデータ処理や、ストリームAPIを活用した効率的なデータ操作のテクニックは、実際の開発において非常に役立つでしょう。
これを機に、CSVファイルの操作に挑戦し、実際のプロジェクトで活用してみてください。