Einführung in OpenCSV

Einführung in OpenCSV

1. Einführung

In diesem kurzen Artikel wird OpenCSV 4 vorgestellt, eine fantastische Bibliothek zum Schreiben, Lesen, Serialisieren, Deserialisieren und / oder Parsen von.csv-Dateien! Im Folgenden werden einige Beispiele aufgeführt, die zeigen, wie Sie OpenCSV 4 für Ihre Bemühungen einrichten und verwenden.

2. Konfiguration

So fügen Sie Ihrem Projekt OpenCSV über die Abhängigkeit vonpom.xmlhinzu:


    com.opencsv
    opencsv
    4.1

Die.jars für OpenCSV können beiofficial site oder durch eine schnelle Suche beiMaven Repository gefunden werden.

Unsere.csv-Datei wird sehr einfach sein. Wir werden sie auf zwei Spalten und vier Zeilen beschränken:

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

3. Bean oder nicht Bean

Nachdem Sie OpenCSV zu Ihrenpom.xmlhinzugefügt haben, können wir CSV-Behandlungsmethoden auf zwei bequeme Arten implementieren:

  1. Verwenden der handlichen ObjekteCSVReader undCSVWriter (für einfachere Operationen) oder

  2. Verwenden vonCsvToBean zum Konvertieren von.csv-Dateien in Beans (die als mit Anmerkungen verseheneplain-old-java-objects implementiert sind).

Wir bleiben bei den Beispielen fürsynchronous (oderblocking) für diesen Artikel, damit wir uns auf die Grundlagen konzentrieren können.

Denken Sie daran, dass die Methodesynchronousverhindert, dass umgebender oder nachfolgender Code ausgeführt wird, bis er abgeschlossen ist. In jeder Produktionsumgebung werden wahrscheinlichasynchronous- oder (non-blocking) -Methoden verwendet, mit denen andere Prozesse oder Methoden abgeschlossen werden können, während dieasynchronous-Methode abgeschlossen ist.

In einem zukünftigen Artikel werden wir uns mit den Beispielen vonasynchronousfür OpenCSV befassen.

3.1. DieCSVReader

CSVReader - durch die mitgelieferten MethodenreadAll() undreadNext()! Schauen wir uns an, wiereadAll () synchron verwendet werden:

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

Dann können wir diese Methode aufrufen, indem wirBufferedReader übergeben:

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

In ähnlicher Weise können wirreadNext () abstrahieren, das eine gelieferte.csv Zeile für Zeile liest:

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

Und wir können diese Methode hier aufrufen, indem wirBufferReader: übergeben

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

Für mehr Flexibilität und Konfigurationsoptionen können Sie alternativCSVReaderBuilder verwenden:

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

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

CSVReaderBuilder ermöglicht es, die Spaltenüberschriften zu überspringen und Parsing-Regeln durchCSVParserBuilder festzulegen.

MitCSVParserBuilder können wir ein benutzerdefiniertes Spaltentrennzeichen auswählen, Anführungszeichen ignorieren oder behandeln, angeben, wie Nullfelder behandelt werden und wie maskierte Zeichen interpretiert werden. Weitere Informationen zu diesen Konfigurationseinstellungen finden Sie in der offiziellen Spezifikationdocs.

Denken Sie wie immer daran, alleReaderszu schließen, um Speicherlecks zu vermeiden!

3.2. DieCSVWriter

CSVWriter bietet in ähnlicher Weise die Möglichkeit, auf einmal oder zeilenweise in eine.csv-Datei zu schreiben.

Schauen wir uns an, wie Sie zeilenweise in ein.csvchreiben:

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

Geben Sie nun an, wo wir diese Datei speichern möchten, und rufen Sie die gerade geschriebene Methode auf:

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

Wir können auch unsere.csv auf einmal schreiben, indem wirList vonString Arrays übergeben, die die Zeilen unserer.csv darstellen. :

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

Und so nennen wir es:

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

Das ist es!

3.3. Bohnenbasiertes Lesen

OpenCSV ist in der Lage,.csv-Dateien in voreingestellte und wiederverwendbare Schemas zu serialisieren, die als kommentierte Javapojo-Beans implementiert sind. CsvToBean wird unter Verwendung vonCsvToBeanBuilder konstruiert. Ab OpenCSV 4 wirdCsvToBeanBuilder empfohlen, um mitcom.opencsv.bean.CsvToBean. zu arbeiten

Hier ist eine einfache Bean, mit der wir unsere zweispaltigen.csv aussection 2. serialisieren können:

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

    @CsvBindByPosition(position = 1)
    private String exampleColTwo;

    // getters and setters
}

Jede Spalte in der.csv-Datei ist einem Feld in der Bean zugeordnet. Die Zuordnungen zwischen den Spaltenüberschriften von.csvkönnen unter Verwendung der Anmerkungen@CsvBindByPosition oder@CsvBindByName durchgeführt werden, die eine Zuordnung nach Position bzw. Übereinstimmung der Überschriftenzeichenfolge angeben.

Erstellen wir zunächst eine Oberklasse mit dem Namen CsvBean. Auf diese Weise können wir die unten erstellten Methoden wiederverwenden und verallgemeinern:

public class CsvBean { }

Ein Beispiel für eine Kinderklasse:

public class NamedColumnBean extends CsvBean {

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

    @CsvBindByName
    private int age;

    // getters and setters
}

Lassen Sie uns ein synchron zurückgegebenesList mitCsvToBean abstrahieren:

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

Wir übergeben unsere Bohne (clazz) und setzen diese alsColumnPositionMappingStrategy. Dabei ordnen wir die Felder unserer Beans den jeweiligen Spalten unserer.csv-Zeilen zu.

Wir können das hier mit der UnterklasseSimplePositionBean derCsvBean nennen, die wir oben geschrieben haben:

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

oder hier unter Verwendung derNamedColumnBean – eine andere Unterklasse derCsvBean:

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

3.4. Bohnenbasiertes Schreiben

Schauen wir uns zum Schluss an, wie Sie mit der KlasseStatefulBeanToCsvin eine Datei.csvchreiben:

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

Hier geben wir an, wie wir unsere Daten abgrenzen, die alsList der angegebenenCsvBean-Objekte angegeben werden.

Wir können dann unsere MethodewriteCsvFromBean() aufrufen, nachdem wir den gewünschten Ausgabedateipfad übergeben haben:

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

4. Fazit

Los geht's - synchrone Codebeispiele fürOpenCSV mit Beans,CSVReader undCSVWriter. Schauen Sie sich die offiziellen Dokumentehere. an

Wie immer werden die Codebeispiele mitover on GitHub angegeben.