1概要


Apache Commons CSV library

には、CSVファイルの作成と読み取りに役立つ多くの機能があります。

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


2 Mavenの依存関係

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

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

このライブラリの最新版を確認するには –

https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%22commons-

csv%22[ここに行く]


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ヘッダ

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

順番に見ていきましょう。


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のCommons CSVライブラリの使用方法を説明しました。ライブラリhttps://commons.apache.org/proper/commons-csv/user-guide.html[here]についてもっと読むことができます。

この記事のコードはhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[over on Github]から入手できます。