1. 概要

Apache Commons CSVライブラリには、CSVファイルを作成および読み取るための多くの便利な機能があります。

このクイックチュートリアルでは、簡単な例を示して、このライブラリを利用する方法を説明します。

2. Mavenの依存関係

まず、Mavenを使用してこのライブラリの最新バージョンをインポートします。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.4</version>
</dependency>

このライブラリの最新バージョンを確認するには–ここに移動

3. CSVファイルの読み取り

本の属性を含むbook.csvという次のCSVファイルについて考えてみます。

author,title
Dan Simmons,Hyperion
Douglas Adams,The Hitchhiker's Guide to the Galaxy

それをどのように読むことができるか見てみましょう:

Map<String, String> AUTHOR_BOOK_MAP = new HashMap<>() {
    {
        put("Dan Simmons", "Hyperion");
        put("Douglas Adams", "The Hitchhiker's Guide to the Galaxy");
    }
});
String[] HEADERS = { "author", "title"};

@Test
public void givenCSVFile_whenRead_thenContentsAsExpected() throws IOException {
    Reader in = new FileReader("book.csv");
    Iterable<CSVRecord> records = CSVFormat.DEFAULT
      .withHeader(HEADERS)
      .withFirstRecordAsHeader()
      .parse(in);
    for (CSVRecord record : records) {
        String author = record.get("author");
        String title = record.get("title");
        assertEquals(AUTHOR_BOOK_MAP.get(author), title);
    }
}

ヘッダーであるため、最初の行をスキップした後、CSVファイルのレコードを読み取っています。

CSVファイルの形式を指定するCSVFormatにはさまざまな種類があり、その例を次の段落で確認できます。

4. CSVファイルの作成

上記と同じCSVファイルを作成する方法を見てみましょう。

public void createCSVFile() throws IOException {
    FileWriter out = new FileWriter("book_new.csv");
    try (CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT
      .withHeader(HEADERS))) {
        AUTHOR_BOOK_MAP.forEach((author, title) -> {
            printer.printRecord(author, title);
        });
    }
}

CSVFormat 宣言で指定したため、新しいCSVファイルは適切なヘッダーで作成されます。

5. ヘッダーと読み取り列

ヘッダーの読み取りと書き込みにはさまざまな方法があります。 同様に、列の値を読み取るにはさまざまな方法があります。

それらを1つずつ見ていきましょう。

5.1. インデックスによる列へのアクセス

これは、列の値を読み取るための最も基本的な方法です。 これは、CSVファイルのヘッダーが不明な場合に使用できます。

Reader in = new FileReader("book.csv");
Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(in);
for (CSVRecord record : records) {
    String columnOne = record.get(0);
    String columnTwo = record.get(1);
}

5.2. 事前定義されたヘッダーによる列へのアクセス

これは、インデックスによるアクセスと比較した場合、列にアクセスするためのより直感的な方法です。

Iterable<CSVRecord> records = CSVFormat.DEFAULT
  .withHeader("author", "title").parse(in);
for (CSVRecord record : records) {
    String author = record.get("author");
    String title = record.get("title");
}

5.3. ヘッダーとしての列挙型の使用

Strings を使用して列の値にアクセスすると、エラーが発生しやすくなります。 文字列の代わりに列挙型を使用すると、コードがより標準化され、理解しやすくなります。

enum BookHeaders {
    author, title
}

Iterable<CSVRecord> records = CSVFormat.DEFAULT
  .withHeader(BookHeaders.class).parse(in);
for (CSVRecord record : records) {
    String author = record.get(BookHeaders.author);
    String title = record.get(BookHeaders.title);
}

5.4. ヘッダー行をスキップする

通常、CSVファイルの最初の行にはヘッダーが含まれています。 したがって、ほとんどの場合、それをスキップして2行目から読み取りを開始しても安全です。

これにより、ヘッダーアクセス列の値が自動検出されます。

Iterable<CSVRecord> records = CSVFormat.DEFAULT
  .withFirstRowAsHeader().parse(in);
for (CSVRecord record : records) {
    String author = record.get("author");
    String title = record.get("title");
}

5.5. ヘッダー付きのファイルの作成

同様に、ヘッダーを含む最初の行を含むCSVファイルを作成できます。

FileWriter out = new FileWriter("book_new.csv");
CSVPrinter printer = CSVFormat.DEFAULT
  .withHeader("author", "title").print(out);

6. 結論

簡単な例を通して、ApacheのCommonsCSVライブラリの使用法を紹介しました。 ライブラリの詳細については、こちらをご覧ください。

この記事のコードは、Githubから入手できます。