OpenCSVの紹介

OpenCSVの概要

1. 前書き

この簡単な記事では、.csvファイルの書き込み、読み取り、シリアル化、逆シリアル化、および/または解析のための素晴らしいライブラリであるOpenCSV4を紹介します。 以下では、OpenCSV4をセットアップして使用する方法を示すいくつかの例を紹介します。

2. セットアップ

pom.xml依存関係を使用してOpenCSVをプロジェクトに追加する方法は次のとおりです。


    com.opencsv
    opencsv
    4.1

OpenCSVの.jarsは、official siteで見つけるか、Maven Repositoryですばやく検索します。

.csvファイルは非常に単純で、2列4行に保持します。

colA, ColB
A, B
C, D
G, G
G, F

3. 豆にするかしないか

OpenCSVをpom.xmlに追加した後、2つの便利な方法でCSV処理メソッドを実装できます。

  1. 便利なCSVReaderおよびCSVWriterオブジェクトを使用する(より簡単な操作のため)または

  2. CsvToBeanを使用して.csvファイルをBeanに変換します(これは注釈付きのplain-old-java-objectsとして実装されます)。

この記事では、synchronous(またはblocking)の例を使用して、基本に集中できるようにします。

synchronousメソッドは、それが完了するまで、周囲のコードまたは後続のコードが実行されないようにすることを忘れないでください。 実稼働環境では、asynchronousまたは(non-blocking)メソッドを使用する可能性が高く、asynchronousメソッドの終了時に他のプロセスまたはメソッドを完了できます。

今後の記事で、OpenCSVのasynchronousの例について詳しく説明します。

3.1. CSVReader

CSVReader –提供されたreadAll()およびreadNext()メソッドを介して! readAll()を同期的に使用する方法を見てみましょう。

public List readAll(Reader reader) throws Exception {
    CSVReader csvReader = new CSVReader(reader);
    List list = new ArrayList<>();
    list = csvReader.readAll();
    reader.close();
    csvReader.close();
    return list;
}

次に、BufferedReaderを渡すことでそのメソッドを呼び出すことができます。

public String readAllExample() throws Exception {
    Reader reader = Files.newBufferedReader(Paths.get(
      ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()));
    return CsvReaderExamples.readAll(reader).toString();
}

同様に、提供された.csvを1行ずつ読み取るreadNext()を抽象化できます。

public List oneByOne(Reader reader) throws Exception {
    List list = new ArrayList<>();
    CSVReader csvReader = new CSVReader(reader);
    String[] line;
    while ((line = csvReader.readNext()) != null) {
        list.add(line);
    }
    reader.close();
    csvReader.close();
    return list;
}

そして、BufferReader:を渡すことで、ここでそのメソッドを呼び出すことができます。

public String oneByOneExample() throws Exception {
    Reader reader = Files.newBufferedReader(Paths.get(
      ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()));
    return CsvReaderExamples.oneByOne(reader).toString();
}

柔軟性と構成オプションを高めるために、代わりにCSVReaderBuilderを使用することもできます。

CSVParser parser = new CSVParserBuilder()
    .withSeparator(',')
    .withIgnoreQuotations(true)
    .build();

CSVReader csvReader = new CSVReaderBuilder(reader)
    .withSkipLines(0)
    .withCSVParser(parser)
    .build();

CSVReaderBuilderを使用すると、列見出しをスキップして、CSVParserBuilderを介して解析ルールを設定できます。

CSVParserBuilderを使用して、カスタム列区切り文字を選択し、引用符を無視または処理し、nullフィールドを処理する方法、およびエスケープ文字を解釈する方法を指定できます。 これらの構成設定の詳細については、公式仕様docsを参照してください。

いつものように、メモリリークを防ぐために、すべてのReadersを閉じることを忘れないでください!

3.2. CSVWriter

同様に、CSVWriterは、.csvファイルに一度にまたは1行ずつ書き込む機能を提供します。

.csvに1行ずつ書き込む方法を見てみましょう。

public String csvWriterOneByOne(List stringArray, Path path) throws Exception {
    CSVWriter writer = new CSVWriter(new FileWriter(path.toString()));
    for (String[] array : stringArray) {
        writer.writeNext(array);
    }

    writer.close();
    return Helpers.readFile(path);
}

次に、そのファイルを保存する場所を指定して、今作成したメソッドを呼び出します。

public String csvWriterOneByOne() throws Exception{
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/writtenOneByOne.csv").toURI());
    return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path);
}

.csvの行を表すString配列のListを渡すことにより、.csvを一度に書き込むこともできます。 :

public String csvWriterAll(List stringArray, Path path) throws Exception {
     CSVWriter writer = new CSVWriter(new FileWriter(path.toString()));
     writer.writeAll(stringArray);
     writer.close();
     return Helpers.readFile(path);
}

そして、これが私たちがそれを呼ぶ方法です:

public String csvWriterAll() throws Exception {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/writtenAll.csv").toURI());
    return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path);
}

それでおしまい!

3.3. Beanベースの読み取り

OpenCSVは、.csvファイルを、注釈付きのJavapojoBeanとして実装されたプリセットおよび再利用可能なスキーマにシリアル化できます。 CsvToBeanは、CsvToBeanBuilderを使用して作成されます。 OpenCSV 4の時点では、CsvToBeanBuildercom.opencsv.bean.CsvToBean.を操作するための推奨される方法です。

2列の.csvsection 2.からシリアル化するために使用できる簡単なBeanを次に示します。

public class SimplePositionBean  {
    @CsvBindByPosition(position = 0)
    private String exampleColOne;

    @CsvBindByPosition(position = 1)
    private String exampleColTwo;

    // getters and setters
}

.csvファイルの各列は、Beanのフィールドに関連付けられています。 .csv列見出し間のマッピングは、位置または見出し文字列の一致によってそれぞれマッピングを指定する@CsvBindByPositionまたは@CsvBindByNameアノテーションを使用して実行できます。

まず、CsvBeanというスーパークラスを作成しましょう。これにより、以下で作成するメソッドを再利用して一般化できます。

public class CsvBean { }

子クラスの例:

public class NamedColumnBean extends CsvBean {

    @CsvBindByName(column = "name")
    private String name;

    @CsvBindByName
    private int age;

    // getters and setters
}

CsvToBeanを使用して、同期的に返されたListを抽象化してみましょう。

 public List beanBuilderExample(Path path, Class clazz) throws Exception {
     CsvTransfer csvTransfer = new CsvTransfer();
     ColumnPositionMappingStrategy ms = new ColumnPositionMappingStrategy();
     ms.setType(clazz);

     Reader reader = Files.newBufferedReader(path);
     CsvToBean cb = new CsvToBeanBuilder(reader)
       .withType(clazz)
       .withMappingStrategy(ms)
       .build();

    csvTransfer.setCsvList(cb.parse());
    reader.close();
    return csvTransfer.getCsvList();
}

Bean(clazz)を渡し、それをColumnPositionMappingStrategyとして設定します。 そうすることで、Beanのフィールドを.csv行のそれぞれの列に関連付けます。

ここでは、上記で記述したCsvBeanSimplePositionBeanサブクラスを使用してこれを呼び出すことができます。

public String simplePositionBeanExample() throws Exception {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/twoColumn.csv").toURI());
    return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString();
}

または、ここでNamedColumnBean –を使用してCsvBeanの別のサブクラスを作成します。

public String namedColumnBeanExample() throws Exception {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/namedColumn.csv").toURI());
    return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString();
}

3.4. Beanベースのライティング

最後に、StatefulBeanToCsvクラスを使用して.csvファイルに書き込む方法を見てみましょう。

public String writeCsvFromBean(Path path) throws Exception {
    Writer writer  = new FileWriter(path.toString());

    StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer)
       .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
       .build();

    List list = new ArrayList<>();
    list.add(new WriteExampleBean("Test1", "sfdsf", "fdfd"));
    list.add(new WriteExampleBean("Test2", "ipso", "facto"));

    sbc.write(list);
    writer.close();
    return Helpers.readFile(path);
}

ここでは、指定されたCsvBeanオブジェクトのListとして提供されるデータを区切る方法を指定しています。

次に、目的の出力ファイルパスを渡した後、メソッドwriteCsvFromBean()を呼び出すことができます。

public String writeCsvFromBeanExample() {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/writtenBean.csv").toURI());
    return BeanExamples.writeCsvFromBean(path);
}

4. 結論

次に、Bean、CSVReader、およびCSVWriterを使用したOpenCSVの同期コード例を示します。 公式ドキュメントhere.をチェックしてください

いつものように、コードサンプルはover on GitHubで提供されます。