Introduction à OpenCSV

Introduction à OpenCSV

1. introduction

Cet article rapide présente OpenCSV 4, une bibliothèque fantastique pour écrire, lire, sérialiser, désérialiser et / ou analyser les fichiers.csv! Ci-dessous, nous allons passer en revue plusieurs exemples montrant comment configurer et utiliser OpenCSV 4 pour vos efforts.

2. Installer

Voici comment ajouter OpenCSV à votre projet via une dépendancepom.xml:


    com.opencsv
    opencsv
    4.1

Les.jars pour OpenCSV peuvent être trouvés dans lesofficial site ou par une recherche rapide surMaven Repository.

Notre fichier.csv sera vraiment simple, nous le garderons à deux colonnes et quatre lignes:

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

3. Bean ou ne pas haricot

Après avoir ajouté OpenCSV à vospom.xml, nous pouvons implémenter des méthodes de gestion CSV de deux manières pratiques:

  1. en utilisant les objets pratiquesCSVReader etCSVWriter (pour des opérations plus simples) ou

  2. utiliserCsvToBean pour convertir les fichiers.csv en beans (qui sont implémentés en tant queplain-old-java-objects annotés).

Nous nous en tiendrons aux exemplessynchronous (oublocking) pour cet article afin que nous puissions nous concentrer sur les bases.

N'oubliez pas qu'une méthodesynchronous empêchera le code environnant ou ultérieur de s'exécuter jusqu'à ce que ce soit fait. Tout environnement de production utilisera probablement les méthodesasynchronous ou (non-blocking) qui permettront à d'autres processus ou méthodes de se terminer pendant que la méthodeasynchronous se termine.

Nous plongerons dans les exemples deasynchronous pour OpenCSV dans un prochain article.

3.1. LesCSVReader

CSVReader - via les méthodesreadAll() etreadNext() fournies! Voyons comment utiliserreadAll () de manière synchrone:

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;
}

Ensuite, nous pouvons appeler cette méthode en passant unBufferedReader:

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

De même, nous pouvons extrairereadNext () qui lit un.csv fourni ligne par ligne:

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;
}

Et nous pouvons appeler cette méthode ici en passant unBufferReader:

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

Pour une plus grande flexibilité et des options de configuration, vous pouvez également utiliserCSVReaderBuilder:

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

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

CSVReaderBuilder permet d'ignorer les en-têtes de colonne et de définir des règles d'analyse viaCSVParserBuilder.

En utilisantCSVParserBuilder, nous pouvons choisir un séparateur de colonne personnalisé, ignorer ou gérer les guillemets, indiquer comment nous allons gérer les champs nuls et comment interpréter les caractères d'échappement. Pour plus d'informations sur ces paramètres de configuration, veuillez vous référer à la spécification officielledocs.

Comme toujours, n'oubliez pas de fermer tous vosReaders pour éviter les fuites de mémoire!

3.2. LesCSVWriter

CSVWriter offre également la possibilité d'écrire dans un fichier.csv en une seule fois ou ligne par ligne.

Voyons comment écrire dans un.csv ligne par ligne:

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);
}

Maintenant, spécifions où nous voulons enregistrer ce fichier et appelons la méthode que nous venons d'écrire:

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

Nous pouvons aussi écrire nos.csv en une seule fois en passant unList deString tableaux représentant les lignes de nos.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);
}

Et voici comment nous l'appelons:

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

C'est ça!

3.3. Lecture basée sur les haricots

OpenCSV est capable de sérialiser les fichiers.csv en schémas prédéfinis et réutilisables implémentés en tant que beans Javapojoannotés. CsvToBean est construit en utilisantCsvToBeanBuilder. Depuis OpenCSV 4,CsvToBeanBuilder est la méthode recommandée pour travailler aveccom.opencsv.bean.CsvToBean.

Voici un bean simple que nous pouvons utiliser pour sérialiser nos.csv à deux colonnes à partir desection 2.:

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

    @CsvBindByPosition(position = 1)
    private String exampleColTwo;

    // getters and setters
}

Chaque colonne du fichier.csv est associée à un champ du bean. Les mappages entre les en-têtes de colonne.csv peuvent être effectués à l'aide des annotations@CsvBindByPosition ou@CsvBindByName qui spécifient respectivement un mappage par correspondance de position ou de chaîne d'en-tête.

Commençons par créer une superclasse appelée CsvBean - cela nous permettra de réutiliser et de généraliser les méthodes que nous allons créer ci-dessous:

public class CsvBean { }

Un exemple de classe enfant:

public class NamedColumnBean extends CsvBean {

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

    @CsvBindByName
    private int age;

    // getters and setters
}

Abstraits unList renvoyé de manière synchrone en utilisant lesCsvToBean:

 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();
}

Nous passons notre bean (clazz) et le définissons comme leColumnPositionMappingStrategy. Ce faisant, nous associons les champs de nos beans aux colonnes respectives de nos lignes.csv.

Nous pouvons appeler cela ici en utilisant la sous-classeSimplePositionBean desCsvBean que nous avons écrit ci-dessus:

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

ou ici en utilisant lesNamedColumnBean – une autre sous-classe desCsvBean:

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

3.4. Écriture à base de haricots

Enfin, voyons comment utiliser la classeStatefulBeanToCsv pour écrire dans un fichier.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);
}

Ici, nous spécifions comment nous allons délimiter nos données qui sont fournies en tant queList des objetsCsvBean spécifiés.

Nous pouvons alors appeler notre méthodewriteCsvFromBean() après avoir passé le chemin du fichier de sortie souhaité:

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

4. Conclusion

Nous y voilà - exemples de code synchrone pourOpenCSV utilisant des beans,CSVReader etCSVWriter. Consultez la documentation officiellehere.

Comme toujours, les échantillons de code sont fournisover on GitHub.