Einführung in OpenCSV

1. Einleitung

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. Einrichtung

So fügen Sie Ihrem Projekt OpenCSV über eine pom.xml- Abhängigkeit hinzu:

 com.opencsv opencsv 4.1  

Die .jars für OpenCSV finden Sie auf der offiziellen Website oder durch eine schnelle Suche im Maven Repository.

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

Nach dem Hinzufügen von OpenCSV zu Ihrer pom.xml können wir CSV-Behandlungsmethoden auf zwei bequeme Arten implementieren:

  1. Verwenden der praktischen Objekte CSVReader und CSVWriter (für einfachere Operationen) oder
  2. mit CsvToBean konvertieren CSV - Dateien in Bohnen (die als kommentierten umgesetzt werden plain-old-java-Objekte ).

Wir bleiben bei synchronen (oder blockierenden ) Beispielen für diesen Artikel, damit wir uns auf die Grundlagen konzentrieren können.

Denken Sie daran, dass eine synchrone Methode verhindert, dass umgebender oder nachfolgender Code ausgeführt wird, bis er abgeschlossen ist. In jeder Produktionsumgebung werden wahrscheinlich asynchrone oder ( nicht blockierende ) Methoden verwendet, mit denen andere Prozesse oder Methoden abgeschlossen werden können, während die asynchrone Methode abgeschlossen ist.

In einem zukünftigen Artikel werden wir uns mit asynchronen Beispielen für OpenCSV befassen.

3.1. Der CSVReader

CSVReader - über die mitgelieferten Methoden readAll () und readNext () ! Schauen wir uns an, wie readAll () synchron verwendet wird:

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 wir einen BufferedReader ü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 wir readNext () abstrahieren, das eine bereitgestellte CSV- Zeile 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 wir einen BufferReader ü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 alternativ CSVReaderBuilder verwenden :

CSVParser parser = new CSVParserBuilder() .withSeparator(',') .withIgnoreQuotations(true) .build(); CSVReader csvReader = new CSVReaderBuilder(reader) .withSkipLines(0) .withCSVParser(parser) .build();

Mit CSVReaderBuilder können Sie die Spaltenüberschriften überspringen und Parsing-Regeln über CSVParserBuilder festlegen .

Mit CSVParserBuilder 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 den offiziellen Spezifikationsdokumenten.

Denken Sie wie immer daran, alle Ihre Leser zu schließen, um Speicherlecks zu vermeiden!

3.2. Der CSVWriter

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

Lassen Sie uns einen Blick darauf werfen, wie Sie zeilenweise in eine CSV-Datei schreiben :

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 wir nun an, wo wir diese Datei speichern möchten, und rufen 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 unsere CSV-Datei auch auf einmal schreiben, indem wir eine Liste von String- Arrays übergeben, die die Zeilen unserer CSV-Datei 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 zu serialisiert CSV - Dateien in vordefinierte und wiederverwendbaren Schemata wie kommentierten Java implementiert pojo Bohnen. CsvToBean wird mit CsvToBeanBuilder erstellt . Ab OpenCSV 4 wird CsvToBeanBuilder empfohlen, um mit com.opencsv.bean.CsvToBean zu arbeiten .

Hier ist eine einfache Bean, mit der wir unsere zweispaltige CSV - Datei aus Abschnitt 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 CSV- Spaltenüberschriften können mithilfe der Annotationen @CsvBindByPosition oder @CsvBindByName durchgeführt werden, die eine Zuordnung nach Position bzw. Übereinstimmung der Überschriftenzeichenfolge angeben.

Lassen Sie uns zunächst eine Oberklasse namens CsvBean erstellen. Auf diese Weise können wir die unten erstellten Methoden wiederverwenden und verallgemeinern:

public class CsvBean { }

Ein Beispiel für eine untergeordnete Klasse:

public class NamedColumnBean extends CsvBean { @CsvBindByName(column = "name") private String name; @CsvBindByName private int age; // getters and setters }

Lassen Sie uns eine synchron zurückgegebene Liste mit CsvToBean 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(); }

We pass in our bean (clazz) and set that as the ColumnPositionMappingStrategy. In doing so, we associate the fields of our beans with the respective columns of our .csv rows.

We can call that here using the SimplePositionBean subclass of the CsvBean we wrote above:

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

or here using the NamedColumnBean – another subclass of the 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-Based Writing

Lastly, let's take a look at how to use the StatefulBeanToCsv class to write to a .csv file:

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

Here, we are specifying how we will delimit our data which is supplied as a List of specified CsvBean objects.

Wir können dann unsere Methode writeCsvFromBean () 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ür OpenCSV mit Beans, CSVReader und CSVWriter . Lesen Sie hier die offiziellen Dokumente.

Wie immer werden die Codebeispiele auf GitHub bereitgestellt.