一般社団法人 全国個人事業主支援協会

COLUMN コラム

前回「CSVファイルから単純なデータを読み込む方法」を紹介しました。今回はCSVファイルからJavaオブジェクトを読み込む方法を紹介します。

1. OpenCSVのインストール

OpenCSVを使用するには、まず依存関係をプロジェクトに追加する必要があります。

Gradleの場合は、build.gradleに以下を追加します。

implementation ‘com.opencsv:opencsv:5.5.2’

2. CSVファイルの読み込み方法

OpenCSVを使ってCSVファイルを読み込むには、通常CSVReaderクラスを使用します。

以下の例では、カスタムオブジェクトに直接マッピングする方法を説明します。

OpenCSVのCsvToBeanクラスを使うと、CSVファイルの各行を指定したカスタムオブジェクトにマッピングすることができます。

import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.CsvToBeanBuilder;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;

public class CsvToBeanExample {
 public static void main(String[] args) {
  try (FileReader reader = new FileReader("sample.csv")) {
   CsvToBean<MyCsvData> csvToBean = new CsvToBeanBuilder<MyCsvData>(reader)
     .withType(MyCsvData.class) 
     .withIgnoreLeadingWhiteSpace(true)
     .build();

   List<MyCsvData> csvData = csvToBean.parse(); 
   for (MyCsvData data : csvData) {
    System.out.println(data); 
   } 
  } catch (IOException e) {
    e.printStackTrace(); 
  } 
 }
}
class MyCsvData {
 // CSVのヘッダーと一致するようにアノテーションを付与@com.opencsv.bean.CsvBindByName(column = "Column1")
 private String column1;

 @com.opencsv.bean.CsvBindByName(column = "Column2")
 private String column2;

 // getter, setterを実装public String getColumn1() { return column1; }
 public void setColumn1(String column1) { this.column1 = column1; }

 public String getColumn2() { return column2; }
 public void setColumn2(String column2) { this.column2 = column2; }

 @Overridepublic String toString() {
  return "Column1=" + column1 + ", Column2=" + column2;
 }
}

3. 注意点

OpenCSVでCSVファイルを扱う際に注意すべきポイントをいくつか挙げます。

(1) データのフォーマット
  CSVファイルにはデフォルトでカンマが区切り文字として使われますが、タブやセミコロンなど他の文字が使われる場合もあります。その場合は、CSVReaderで区切り文字を指定する必要があります。
(2) 例外処理
  ファイルが存在しない、またはフォーマットが異なる場合にはIOExceptionやCsvValidationExceptionが発生します。これを適切に処理することが重要です。
(3) 特殊文字や改行の扱い
  フィールド内にカンマ、引用符、改行などが含まれる場合、それらをエスケープする処理が必要です。OpenCSVはこれらをデフォルトで処理しますが、独自のフォーマットがある場合はエスケープ方法をカスタマイズすることもできます。
(4) メモリ使用量
  大きなCSVファイルを読み込む際にはメモリ使用量に注意が必要です。非常に大きなファイルを一括で読み込むとメモリ不足になる可能性があるため、行ごとに処理を行うストリーム方式での読み込みを検討すると良いでしょう。
(5) ヘッダーの扱い
  ヘッダー行があるかどうかで処理が異なります。CSVReaderでヘッダー行を無視する場合はwithSkipLines(1)を利用するか、CsvToBeanBuilderを使ってヘッダー行を読み飛ばす設定を行います。

最後にOpenCSVを使うことで、CSVファイルの読み込み処理が簡単に行えるようになります。基本的な使い方とともに、データフォーマットの違いやメモリの問題にも注意して設計することで、より安全かつ効率的なCSVデータの処理が可能です。

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア