1. 序章

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

2. 設定

まず、 pom.xml 依存関係を使用して、OpenCSVをプロジェクトに追加します。

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>4.1</version>
</dependency>

OpenCSVの.jarsは、公式サイトで、またはMavenリポジトリでクイック検索して見つけることができます。

.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 として実装されます)

この記事では、同期(またはブロッキング)の例に固執するので、基本に集中できます。

同期メソッドは、実行が完了するまで、周囲のコードまたは後続のコードが実行されないようにすることを忘れないでください。 実稼働環境では、非同期(またはノンブロッキング)メソッドを使用する可能性があります。これにより、非同期メソッドの終了時に他のプロセスまたはメソッドを完了できます。

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

3.1. CSVReader

提供されているreadAll()および readNext()メソッドを使用して、CSVReaderを調べてみましょう。 readAll ()を同期的に使用する方法を見ていきます。

public List<String[]> readAll(Reader reader) throws Exception {
    CSVReader csvReader = new CSVReader(reader);
    List<String[]> 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();
}

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

public List<String[]> oneByOne(Reader reader) throws Exception {
    List<String[]> 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を参照してください。

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

3.2. CSVWriter

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

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

public String csvWriterOneByOne(List<String[]> 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 csvWriterSyncOneByOne() 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<String[]> stringArray, Path path) throws Exception {
     CSVWriter writer = new CSVWriter(new FileWriter(path.toString()));
     writer.writeAll(stringArray);
     writer.close();
     return Helpers.readFile(path);
}

最後に、これが私たちがそれを呼ぶ方法です:

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

3.3. Beanベースの読み取り

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

これは、セクション2から2列の .csvをシリアル化するために使用できる単純な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 を使用して、同期的に返されたリストを抽象化します。

 public List<CsvBean> 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<CsvBean> 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の同期コード例について説明しました。 詳細については、公式ドキュメントこちらをご覧ください。

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