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:
-
Verwenden der handlichen ObjekteCSVReader undCSVWriter (für einfachere Operationen) oder
-
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.