Inleiding tot OpenCSV

1. Inleiding

Dit korte artikel introduceert OpenCSV 4, een fantastische bibliotheek voor schrijven, lezen, serialiseren, deserialiseren en / of parseren .csv bestanden! Hieronder zullen we verschillende voorbeelden doornemen die laten zien hoe u OpenCSV 4 kunt instellen en gebruiken voor uw inspanningen.

2. Installatie

Hier leest u hoe u OpenCSV aan uw project toevoegt door middel van een pom.xml afhankelijkheid:

 com.opencsv opencsv 4.1 

De .potten voor OpenCSV is te vinden op de officiële site of door snel te zoeken op Maven Repository.

Onze .csv bestand zal heel eenvoudig zijn, we houden het aan twee kolommen en vier rijen:

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

3. Bonen of niet Bonen

Na het toevoegen van OpenCSV aan uw pom.xmlkunnen we CSV-afhandelingsmethoden op twee handige manieren implementeren:

  1. met behulp van de handige CSV-reader en CSV-schrijver objecten (voor eenvoudigere bewerkingen) of
  2. gebruik makend van CsvToBean bekeren .csv bestanden in bonen (die zijn geïmplementeerd als geannoteerd gewone-oude-java-objecten).

We blijven bij synchroon (of blokkeren) voorbeelden voor dit artikel, zodat we ons kunnen concentreren op de basis.

Onthoud, a synchroon methode zal voorkomen dat omringende of daaropvolgende code wordt uitgevoerd totdat het klaar is. Elke productieomgeving zal waarschijnlijk gebruik maken van asynchroon of (niet-blokkerend) methoden waarmee andere processen of methoden kunnen worden voltooid terwijl de asynchroon methode is voltooid.

We duiken erin asynchroon voorbeelden voor OpenCSV in een toekomstig artikel.

3.1. De CSV-reader

CSV-reader - via de meegeleverde alles lezen() en readNext () methoden! Laten we eens kijken hoe u alles lezen() synchroon:

openbare lijst readAll (Reader-lezer) genereert Uitzondering {CSVReader csvReader = nieuwe CSVReader (lezer); Lijstlijst = nieuwe ArrayList (); lijst = csvReader.readAll (); reader.close (); csvReader.close (); retourlijst; }

Dan kunnen we die methode aanroepen door een BufferedReader:

public String readAllExample () genereert uitzondering {Reader reader = Files.newBufferedReader (Paths.get (ClassLoader.getSystemResource ("csv / twoColumn.csv"). toURI ())); retourneer CsvReaderExamples.readAll (lezer) .toString (); }

Evenzo kunnen we abstraheren readNext() die een geleverd .csv lijn bij lijn:

openbare lijst oneByOne (Reader-lezer) gooit uitzondering {List list = new ArrayList (); CSVReader csvReader = nieuwe CSVReader (reader); String [] regel; while ((line = csvReader.readNext ())! = null) {list.add (regel); } reader.close (); csvReader.close (); retourlijst; }

En we kunnen die methode hier noemen door een BufferReader:

openbare String oneByOneExample () genereert Uitzondering {Reader reader = Files.newBufferedReader (Paths.get (ClassLoader.getSystemResource ("csv / twoColumn.csv"). toURI ())); retourneer CsvReaderExamples.oneByOne (lezer) .toString (); } 

Voor meer flexibiliteit en configuratie-opties kunt u als alternatief gebruik maken van CSVReaderBuilder:

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

CSVReaderBuilder staat iemand toe om de kolomtitels over te slaan en parseerregels in te stellen CSVParserBuilder.

Gebruik makend van CSVParserBuilderkunnen we een aangepast kolomscheidingsteken kiezen, aanhalingstekens negeren of afhandelen, aangeven hoe we met null-velden omgaan en hoe we escapetekens interpreteren. Raadpleeg de officiële specificatiedocumenten voor meer informatie over deze configuratie-instellingen.

Denk er zoals altijd aan om al uw Lezers om geheugenlekken te voorkomen!

3.2. De CSV-schrijver

CSV-schrijver biedt op dezelfde manier de mogelijkheid om te schrijven naar een .csv bestand allemaal tegelijk of regel voor regel.

Laten we eens kijken hoe u schrijft naar een .csv lijn bij lijn:

public String csvWriterOneByOne (List stringArray, Path path) genereert Uitzondering {CSVWriter writer = nieuwe CSVWriter (nieuwe FileWriter (path.toString ())); voor (String [] array: stringArray) {writer.writeNext (array); } writer.close (); terug Helpers.readFile (pad); } 

Laten we nu specificeren waar we dat bestand willen opslaan en de methode aanroepen die we zojuist hebben geschreven:

openbare String csvWriterOneByOne () gooit Uitzondering {Path path = Paths.get (ClassLoader.getSystemResource ("csv /writOneByOne.csv"). toURI ()); retourneer CsvWriterExamples.csvWriterOneByOne (Helpers.fourColumnCsvString (), pad); }

We kunnen ook onze schrijven .csv allemaal tegelijk door een Lijst van Draad arrays die de rijen van onze .csv. :

public String csvWriterAll (List stringArray, Path path) genereert Uitzondering {CSVWriter writer = nieuwe CSVWriter (nieuwe FileWriter (path.toString ())); writer.writeAll (stringArray); schrijver.close (); terug Helpers.readFile (pad); }

En zo noemen we het:

openbare String csvWriterAll () gooit Uitzondering {Path path = Paths.get (ClassLoader.getSystemResource ("csv /writAll.csv"). toURI ()); retourneer CsvWriterExamples.csvWriterAll (Helpers.fourColumnCsvString (), pad); }

Dat is het!

3.3. Op bonen gebaseerd lezen

OpenCSV kan serialiseren .csv bestanden in vooraf ingestelde en herbruikbare schema's geïmplementeerd als geannoteerde Java pojo bonen. CsvToBean is geconstrueerd met behulp van CsvToBeanBuilder. Vanaf OpenCSV 4, CsvToBeanBuilder is de aanbevolen manier om mee te werken com.opencsv.bean.CsvToBean.

Hier is een eenvoudige boon die we kunnen gebruiken om onze twee kolommen te serialiseren .csv van sectie 2.:

openbare klasse SimplePositionBean {@CsvBindByPosition (positie = 0) privé String exampleColOne; @CsvBindByPosition (position = 1) private String exampleColTwo; // getters en setters} 

Elke kolom in het .csv bestand is gekoppeld aan een veld in de bean. De toewijzingen tussen .csv kolomtitels kunnen worden uitgevoerd met de @CsvBindByPosition of de @CsvBindByName annotaties die een toewijzing specificeren op respectievelijk positie of kopstringovereenkomst.

Laten we eerst een superklasse maken met de naam CsvBean - hierdoor kunnen we de methoden die we hieronder bouwen opnieuw gebruiken en generaliseren:

openbare klasse CsvBean {}

Een voorbeeld van een kinderklasse:

openbare klasse NamedColumnBean breidt CsvBean {@CsvBindByName (column = "naam") privé Stringnaam uit; @CsvBindByName privé int leeftijd; // getters en setters}

Laten we een synchroon geretourneerd abstract abstract maken Lijst de ... gebruiken CsvToBean:

 openbare lijst beanBuilderExample (padpad, class clazz) genereert uitzondering {CsvTransfer csvTransfer = nieuwe CsvTransfer (); ColumnPositionMappingStrategy ms = nieuwe ColumnPositionMappingStrategy (); ms.setType (clazz); Reader reader = Files.newBufferedReader (pad); CsvToBean cb = nieuwe CsvToBeanBuilder (lezer) .withType (clazz) .withMappingStrategy (ms) .build (); csvTransfer.setCsvList (cb.parse ()); reader.close (); terug csvTransfer.getCsvList (); }

We passeren onze boon (clazz) en stel dat in als de ColumnPositionMappingStrategy. Daarbij associëren we de velden van onze bonen met de respectievelijke kolommen van onze .csv rijen.

We kunnen dat hier noemen met behulp van de SimplePositionBean subklasse van de CsvBean we schreven hierboven:

public String simplePositionBeanExample () genereert Uitzondering {Path path = Paths.get (ClassLoader.getSystemResource ("csv / twoColumn.csv"). toURI ()); retourneer BeanExamples.beanBuilderExample (pad, SimplePositionBean.class) .toString (); }

of hier met behulp van de NamedColumnBean - een andere subklasse van de CsvBean:

public String namedColumnBeanExample () genereert Uitzondering {Path path = Paths.get (ClassLoader.getSystemResource ("csv / namedColumn.csv"). toURI ()); retourneer BeanExamples.beanBuilderExample (pad, NamedColumnBean.class) .toString (); }

3.4. Op bonen gebaseerd schrijven

Laten we ten slotte eens kijken hoe u het StatefulBeanToCsv klasse om te schrijven naar een .csv het dossier:

public String writeCsvFromBean (Path path) genereert Uitzondering {Writer writer = nieuwe FileWriter (path.toString ()); StatefulBeanToCsv sbc = nieuwe StatefulBeanToCsvBuilder (schrijver) .withSeparator (CSVWriter.DEFAULT_SEPARATOR) .build (); Lijstlijst = nieuwe ArrayList (); list.add (nieuwe WriteExampleBean ("Test1", "sfdsf", "fdfd")); list.add (new WriteExampleBean ("Test2", "ipso", "facto")); sbc.write (lijst); schrijver.close (); terug Helpers.readFile (pad); }

Hier specificeren we hoe we onze gegevens zullen afbakenen die worden geleverd als een Lijst van gespecificeerd CsvBean voorwerpen.

We kunnen dan onze methode aanroepen writeCsvFromBean () na het doorgeven van het gewenste outputbestandspad:

openbare String writeCsvFromBeanExample () {Path path = Paths.get (ClassLoader.getSystemResource ("csv /writBean.csv"). toURI ()); retourneer BeanExamples.writeCsvFromBean (pad); }

4. Conclusie

Daar gaan we - synchrone codevoorbeelden voor OpenCSV bonen gebruiken, CSV-reader, en CSV-schrijver. Bekijk hier de officiële documenten.

Zoals altijd worden de codevoorbeelden verstrekt op GitHub.