Introduktion til OpenCSV

1. Introduktion

Denne hurtige artikel introducerer OpenCSV 4, et fantastisk bibliotek til skrivning, læsning, serialisering, deserialisering og / eller parsing .csv filer! Nedenfor gennemgår vi flere eksempler, der demonstrerer, hvordan du opsætter og bruger OpenCSV 4 til dine bestræbelser.

2. Opsætning

Sådan tilføjes OpenCSV til dit projekt ved hjælp af en pom.xml afhængighed:

 com.opencsv opencsv 4.1 

Det . krukker til OpenCSV kan findes på det officielle websted eller gennem en hurtig søgning på Maven Repository.

Vores .csv filen vil være virkelig enkel, vi holder den i to kolonner og fire rækker:

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

3. At bønner eller ikke bønner

Efter at have tilføjet OpenCSV til din pom.xml, kan vi implementere CSV-håndteringsmetoder på to praktiske måder:

  1. ved hjælp af det praktiske CSVReader og CSVWriter objekter (til enklere betjening) eller
  2. ved brug af CsvToBean at konvertere .csv filer til bønner (som implementeres som kommenterede almindeligt gamle-java-objekter).

Vi holder fast ved synkron (eller blokering) eksempler på denne artikel, så vi kan fokusere på det grundlæggende.

Husk, a synkron metode forhindrer, at omgivende eller efterfølgende kode udføres, indtil den er færdig. Ethvert produktionsmiljø vil sandsynligvis blive brugt asynkron eller (ikke-blokerende) metoder, der gør det muligt at udføre andre processer eller metoder, mens asynkron metoden afsluttes.

Vi dykker ned i asynkron eksempler på OpenCSV i en fremtidig artikel.

3.1. Det CSVReader

CSVReader - gennem det medfølgende readAll () og readNext () metoder! Lad os se på, hvordan du bruger læse alt() synkront:

offentlig liste readAll (Reader reader) kaster Undtagelse {CSVReader csvReader = ny CSVReader (læser); Liste liste = ny ArrayList (); liste = csvReader.readAll (); reader.close (); csvReader.close (); returliste }

Så kan vi kalde den metode ved at sende en BufferedReader:

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

På samme måde kan vi abstrakte readNext() der læser en leveret .csv linje for linje:

offentlig liste oneByOne (læserlæser) kaster undtagelse {liste liste = ny ArrayList (); CSVReader csvReader = ny CSVReader (læser); Streng [] linje; mens ((line = csvReader.readNext ())! = null) {list.add (line); } reader.close (); csvReader.close (); returliste }

Og vi kan kalde den metode her ved at sende en BufferReader:

offentlig streng oneByOneExample () kaster undtagelse {Reader reader = Files.newBufferedReader (Paths.get (ClassLoader.getSystemResource ("csv / twoColumn.csv"). toURI ())); returner CsvReaderExamples.oneByOne (reader) .toString (); } 

For større fleksibilitet og konfigurationsmuligheder kan du alternativt bruge CSVReaderBuilder:

CSVParser parser = ny CSVParserBuilder () .withSeparator (',') .withIgnoreQuotations (true) .build (); CSVReader csvReader = ny CSVReaderBuilder (læser) .withSkipLines (0) .withCSVParser (parser) .build ();

CSVReaderBuilder tillader en at springe over kolonneoverskrifterne og indstille parseringsregler igennem CSVParserBuilder.

Ved brug af CSVParserBuilder, kan vi vælge en brugerdefineret søjleseparator, ignorere eller håndtere anførselstegn, angive, hvordan vi håndterer nulfelter, og hvordan vi fortolker undslapte tegn. For mere information om disse konfigurationsindstillinger henvises til de officielle specifikationsdokumenter.

Husk som altid at lukke alle dine Læsere for at forhindre lækager i hukommelsen!

3.2. Det CSVWriter

CSVWriter leverer på samme måde evnen til at skrive til en .csv arkiver alt på én gang eller linje for linje.

Lad os se på, hvordan man skriver til en .csv linje for linje:

public String csvWriterOneByOne (List stringArray, Path path) throw Exception {CSVWriter writer = new CSVWriter (new FileWriter (path.toString ())); for (String [] array: stringArray) {writer.writeNext (array); } writer.close (); returner Helpers.readFile (sti); } 

Lad os nu specificere, hvor vi vil gemme den fil og kalde den metode, vi lige har skrevet:

offentlig streng csvWriterOneByOne () kaster undtagelse {Path path = Paths.get (ClassLoader.getSystemResource ("csv / writtenOneByOne.csv"). toURI ()); returnere CsvWriterExamples.csvWriterOneByOne (Helpers.fourColumnCsvString (), sti); }

Vi kan også skrive vores .csv alt på én gang ved at passere i en Liste af Snor arrays, der repræsenterer rækkerne i vores .csv. :

public String csvWriterAll (List stringArray, Path path) throw Exception {CSVWriter writer = new CSVWriter (new FileWriter (path.toString ())); writer.writeAll (stringArray); writer.close (); returner Helpers.readFile (sti); }

Og sådan kalder vi det:

offentlig streng csvWriterAll () kaster undtagelse {Path path = Paths.get (ClassLoader.getSystemResource ("csv / writtenAll.csv"). toURI ()); returnere CsvWriterExamples.csvWriterAll (Helpers.fourColumnCsvString (), sti); }

Det er det!

3.3. Bønnebaseret læsning

OpenCSV er i stand til at serialisere .csv filer til forudindstillede og genanvendelige skemaer implementeret som kommenteret Java pojo bønner. CsvToBean er konstrueret ved hjælp af CsvToBeanBuilder. Fra og med OpenCSV 4, CsvToBeanBuilder er den anbefalede måde at arbejde med com.opencsv.bean.CsvToBean.

Her er en simpel bønne, vi kan bruge til at serieisere vores to-søjler .csv fra afsnit 2.:

offentlig klasse SimplePositionBean {@CsvBindByPosition (position = 0) privat StrengeksempelColOne; @CsvBindByPosition (position = 1) privat streng eksempelColTwo; // getters og setters} 

Hver kolonne i .csv filen er knyttet til et felt i bønnen. Kortlægningen mellem .csv kolonneoverskrifter kan udføres ved hjælp af @CsvBindByPosition eller den @CsvBindByName annoteringer, der angiver henholdsvis en kortlægning efter position eller overskriftstrengs match.

Lad os først oprette en superklasse kaldet CsvBean - dette giver os mulighed for at genbruge og generalisere de metoder, vi bygger nedenfor:

offentlig klasse CsvBean {}

Et eksempel på børneklasse:

offentlig klasse NamedColumnBean udvider CsvBean {@CsvBindByName (column = "name") privat strengnavn; @CsvBindByName privat int age; // getters og setters}

Lad os abstrakte en synkron retur Liste bruger CsvToBean:

 offentlig liste beanBuilderExample (sti, klasse clazz) kaster undtagelse {CsvTransfer csvTransfer = ny CsvTransfer (); ColumnPositionMappingStrategy ms = ny ColumnPositionMappingStrategy (); ms.setType (clazz); Læserlæser = Files.newBufferedReader (sti); CsvToBean cb = ny CsvToBeanBuilder (læser) .withType (clazz) .withMappingStrategy (ms) .build (); csvTransfer.setCsvList (cb.parse ()); reader.close (); returnere csvTransfer.getCsvList (); }

Vi passerer i vores bønne (clazz) og indstil det som ColumnPositionMappingStrategy. Dermed forbinder vi markerne på vores bønner med de respektive kolonner i vores .csv rækker.

Vi kan kalde det her ved hjælp af SimplePositionBean underklasse af CsvBean vi skrev ovenfor:

offentlig streng simplePositionBeanExample () kaster undtagelse {Path path = Paths.get (ClassLoader.getSystemResource ("csv / twoColumn.csv"). toURI ()); returner BeanExamples.beanBuilderExample (sti, SimplePositionBean.class) .toString (); }

eller her ved hjælp af NamedColumnBean - en anden underklasse af CsvBean:

offentlig streng navngivetColumnBeanExample () kaster undtagelse {Path path = Paths.get (ClassLoader.getSystemResource ("csv / namedColumn.csv"). toURI ()); returner BeanExamples.beanBuilderExample (sti, NamedColumnBean.class) .toString (); }

3.4. Bønnebaseret skrivning

Endelig, lad os tage et kig på, hvordan du bruger StatefulBeanToCsv klasse at skrive til en .csv fil:

offentlig String writeCsvFromBean (sti) kaster Undtagelse {Writer writer = new FileWriter (path.toString ()); StatefulBeanToCsv sbc = ny StatefulBeanToCsvBuilder (forfatter) .withSeparator (CSVWriter.DEFAULT_SEPARATOR) .build (); Liste liste = ny ArrayList (); list.add (ny WriteExampleBean ("Test1", "sfdsf", "fdfd")); list.add (ny WriteExampleBean ("Test2", "ipso", "facto")); sbc.write (liste); writer.close (); returner Helpers.readFile (sti); }

Her specificerer vi, hvordan vi afgrænser vores data, der leveres som en Liste af specificeret CsvBean genstande.

Vi kan så kalde vores metode writeCsvFromBean () efter at have sendt den ønskede outputfilsti:

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

4. Konklusion

Der går vi - eksempler på synkron kode til OpenCSV ved hjælp af bønner, CSVReaderog CSVWriter. Tjek de officielle dokumenter her.

Som altid leveres kodeeksemplerne på GitHub.