1前書き

この簡単な記事では、OpenCSV 4、

.csv

ファイルの作成、読み取り、直列化、直列化復元、および/または構文解析のための素晴らしいライブラリを紹介します。以下に、OpenCSV 4をセットアップして使用する方法を示すいくつかの例を紹介します。


2セットアップ


pom.xml

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

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

OpenCSV用の

.jars

は、http://opencsv.sourceforge.net/[公式サイト]またはhttps://mvnrepository.com/artifact/com.opencsv/opencsv[Maven Repositoryで簡単に検索できます。]。


.csv

ファイルは非常に単純になるでしょう。2列4行にします。

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


3豆にかどうか

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

  1. 便利な

    CSVReader

    および

    CSVWriter

    オブジェクトを使用する

操作)または


CsvToBean

を使用して

.csv

ファイルをBean(これは

注釈付きの

plain-old-java-objects

)として実装されています。

この記事では

synchronous

(または

blocking

)の例を使用して基本を説明します。

覚えておいて欲しいのは、

synchronous

メソッドは、それが終了するまで周囲のコードや後続のコードが実行されるのを防ぐということです。実稼働環境では、

asynchronous

メソッドが終了するまでに他のプロセスやメソッドを完了させることができる

asynchronous

または(

non-blocking

)メソッドを使用する可能性があります。

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


3.1.

CSVReader



CSVReader

– 提供されている

readAll()

および

readNext()

メソッドを介して!


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(
      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(
      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フィールドの処理方法、およびエスケープ文字の解釈方法を指定できます。これらの設定の詳細については、公式仕様書http://opencsv.sourceforge.net/apidocs/index.html[docs]を参照してください。

いつものように、メモリリークを防ぐためにすべての

Readers

を閉じることを忘れないでください!


3.2.

CSVWriter



CSVWriter

も同様に、一度に1行ずつ、または1行ずつ

.csv

ファイルに書き込むことができます。


.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 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<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 csvWriterAll() throws Exception {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/writtenAll.csv").toURI());
    return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path);
}

それでおしまい!


3.3. 豆ベースの読み方

OpenCSVは

.csv

ファイルを、注釈付きのJava

pojo

Beanとして実装されたプリセットスキーマと再利用可能スキーマにシリアル化することができます。

CsvToBean



CsvToBeanBuilder

を使用して構築されます。 OpenCSV 4以降、

CsvToBeanBuilder



com.opencsv.bean.CsvToBean.

を操作するための推奨される方法です。

これは、

section 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

を使用して、同期的に返された

List

を抽象化しましょう。

 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

行のそれぞれの列に関連付けます。

これは、先ほど書いた

CsvBean



SimplePositionBean

サブクラスを使ってここで呼び出すことができます。

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

のための同期コード例公式文書http://opencsv.sourceforge.net/[ここをチェックしてください。]

いつものように、コードサンプルはhttps://github.com/eugenp/tutorials/tree/master/libraries[over GitHub]で提供されています。