Uvod u OpenCSV

1. Uvod

Ovaj kratki članak predstavlja OpenCSV 4, fantastičnu biblioteku za pisanje, čitanje, serializaciju, deserializaciju i / ili raščlanjivanje .csv datoteke! U nastavku ćemo proći kroz nekoliko primjera koji pokazuju kako postaviti i koristiti OpenCSV 4 za vaše napore.

2. Postavljanje

Evo kako dodati OpenCSV u svoj projekt putem a pom.xml ovisnost:

 com.opencsv opencsv 4.1 

The .staklenke za OpenCSV možete pronaći na službenim stranicama ili putem brze pretrage u Maven Repository.

Naše .csv datoteka će biti vrlo jednostavna, zadržat ćemo je u dva stupca i četiri retka:

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

3. Bean ili Ne bean

Nakon dodavanja OpenCSV-a na svoj pom.xml, metode za obradu CSV-a možemo implementirati na dva prikladna načina:

  1. koristeći zgodno CSVReader i CSVWriter objekti (za jednostavnije operacije) ili
  2. koristeći CsvToBean pretvoriti .csv datoteke u grah (koji su implementirani kao označeni obični-stari-java-objekti).

Držat ćemo se sinkroni (ili blokiranje) primjere za ovaj članak kako bismo se mogli usredotočiti na osnove.

Zapamtite, a sinkroni metoda spriječit će izvršavanje okolnog ili naknadnog koda dok to ne završi. Bilo koje proizvodno okruženje vjerojatno će se koristiti asinkroni ili (neblokirajući) metode koje će omogućiti dovršenje drugih procesa ili metoda dok asinkroni metoda završava.

Zaronit ćemo u asinkroni primjeri za OpenCSV u budućem članku.

3.1. The CSVReader

CSVReader - kroz isporučeni readAll () i readNext () metode! Pogledajmo kako koristiti čitajSve() sinkrono:

javni popis readAll (čitač čitača) baca izuzetak {CSVReader csvReader = novi CSVReader (čitač); Lista popisa = novi ArrayList (); popis = csvReader.readAll (); čitač.close (); csvReader.close (); popis za povratak; }

Tada tu metodu možemo nazvati predavanjem a BufferedReader:

javni String readAllExample () baca iznimku {Reader reader = Files.newBufferedReader (Paths.get (ClassLoader.getSystemResource ("csv / twoColumn.csv"). toURI ())); return CsvReaderExamples.readAll (čitač) .toString (); }

Slično tome, možemo apstrahirati readNext() koji čita isporučeno .csv redak po redak:

javni popis oneByOne (čitač čitača) baca izuzetak {Lista popisa = novi ArrayList (); CSVReader csvReader = novi CSVReader (čitač); String [] redak; while ((linija = csvReader.readNext ())! = null) {list.add (linija); } čitač.close (); csvReader.close (); popis za povratak; }

A tu metodu ovdje možemo nazvati dodavanjem a BufferReader:

javni String oneByOneExample () baca iznimku {Reader reader = Files.newBufferedReader (Paths.get (ClassLoader.getSystemResource ("csv / twoColumn.csv"). toURI ())); vrati CsvReaderExamples.oneByOne (čitač) .toString (); } 

Za veću fleksibilnost i mogućnosti konfiguracije možete alternativno koristiti CSVReaderBuilder:

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

CSVReaderBuilder omogućuje preskakanje naslova stupaca i postavljanje pravila raščlanjivanja CSVParserBuilder.

Koristeći CSVParserBuilder, možemo odabrati prilagođeni separator stupaca, zanemariti ili rukovati navodnicima, navesti kako ćemo postupati s nultim poljima i kako interpretirati odbjegle znakove. Za više informacija o ovim postavkama konfiguracije pogledajte službene dokumente sa specifikacijama.

Kao i uvijek, ne zaboravite zatvoriti sve svoje Čitatelji kako bi se spriječilo curenje memorije!

3.2. The CSVWriter

CSVWriter slično pruža mogućnost pisanja u a .csv datoteku odjednom ili redak po redak.

Pogledajmo kako pisati u .csv redak po redak:

javni String csvWriterOneByOne (Popis stringArray, Put puta) baca izuzetak {CSVWriter Writer = novi CSVWriter (novi FileWriter (path.toString ())); for (String [] array: stringArray) {writer.writeNext (niz); } pisac.close (); return Helpers.readFile (put); } 

Sada, odredimo gdje želimo spremiti tu datoteku i pozovimo metodu koju smo upravo napisali:

javni String csvWriterOneByOne () baca izuzetak {Put puta = Paths.get (ClassLoader.getSystemResource ("csv / writtenOneByOne.csv"). toURI ()); vratiti CsvWriterExamples.csvWriterOneByOne (Helpers.fourColumnCsvString (), put); }

Također možemo napisati svoj .csv odjednom prolaskom u Popis od Niz nizovi koji predstavljaju redove našeg .csv. :

javni String csvWriterAll (Popis stringArray, Put puta) baca izuzetak {CSVWriter Writer = novi CSVWriter (novi FileWriter (path.toString ())); writer.writeAll (stringArray); pisac.close (); return Helpers.readFile (put); }

I evo kako to zovemo:

javni String csvWriterAll () baca izuzetak {Put puta = Paths.get (ClassLoader.getSystemResource ("csv / writtenAll.csv"). toURI ()); vrati CsvWriterExamples.csvWriterAll (Helpers.fourColumnCsvString (), put); }

To je to!

3.3. Čitanje na bazi graha

OpenCSV je u stanju se serirati .csv datoteke u unaprijed postavljene sheme i sheme za višekratnu uporabu implementirane kao označena Java pojo grah. CsvToBean konstruira se pomoću CsvToBeanBuilder. Od OpenCSV 4, CsvToBeanBuilder je preporučeni način rada s com.opencsv.bean.CsvToBean.

Evo jednostavnog graha koji možemo koristiti za serializiranje dvostupaca .csv iz odjeljak 2.:

javna klasa SimplePositionBean {@CsvBindByPosition (position = 0) private String exampleColOne; @CsvBindByPosition (position = 1) private String exampleColTwo; // geteri i postavljači} 

Svaki stupac u .csv datoteka je povezana s poljem u grahu. Mapiranja između .csv Naslovi stupaca mogu se izvesti pomoću @CsvBindByPosition ili @CsvBindByName napomene koje specificiraju mapiranje po položaju, odnosno podudaranju niza naslova.

Prvo, izradimo superklasu nazvanu CsvBean - to će nam omogućiti ponovnu upotrebu i generaliziranje metoda koje ćemo izgraditi u nastavku:

javna klasa CsvBean {}

Primjer dječje klase:

javna klasa NamedColumnBean proširuje CsvBean {@CsvBindByName (column = "name") ime privatnog niza; @CsvBindByName private int age; // geteri i postavljači}

Apstrahirajmo sinkrono vraćeni Popis koristiti CsvToBean:

 javni popis beanBuilderExample (Put puta, klasa klaza) baca iznimku {CsvTransfer csvTransfer = new CsvTransfer (); ColumnPositionMappingStrategy ms = novo ColumnPositionMappingStrategy (); ms.setType (klazz); Čitač čitača = Files.newBufferedReader (put); CsvToBean cb = novi CsvToBeanBuilder (čitač) .withType (clazz) .withMappingStrategy (ms) .build (); csvTransfer.setCsvList (cb.parse ()); čitač.close (); vrati csvTransfer.getCsvList (); }

Prolazimo u našem grahu (pljesak) i postavite to kao ColumnPositionMappingStrategy. Pritom polja našeg graha povezujemo sa odgovarajućim stupcima našeg .csv redaka.

Ovdje to možemo nazvati pomoću SimplePositionBean podrazred CsvBean gore smo napisali:

javni String simplePositionBeanExample () baca izuzetak {Put puta = Paths.get (ClassLoader.getSystemResource ("csv / twoColumn.csv"). toURI ()); return BeanExamples.beanBuilderExample (put, SimplePositionBean.class) .toString (); }

ili ovdje pomoću NamedColumnBean - još jedan podrazred CsvBean:

javni niz namedColumnBeanExample () baca izuzetak {Put puta = Paths.get (ClassLoader.getSystemResource ("csv / namedColumn.csv"). toURI ()); return BeanExamples.beanBuilderExample (put, NamedColumnBean.class) .toString (); }

3.4. Pisanje na bazi graha

Na kraju, pogledajmo kako koristiti StatefulBeanToCsv razred za pisanje u .csv datoteka:

javni String writeCsvFromBean (Put puta) baca iznimku {Writer Writer = novi FileWriter (path.toString ()); StatefulBeanToCsv sbc = novi StatefulBeanToCsvBuilder (pisac) .withSeparator (CSVWriter.DEFAULT_SEPARATOR) .build (); Lista popisa = novi ArrayList (); list.add (novi WriteExampleBean ("Test1", "sfdsf", "fdfd")); list.add (novi WriteExampleBean ("Test2", "ipso", "facto")); sbc.write (popis); pisac.close (); return Helpers.readFile (put); }

Ovdje preciziramo kako ćemo razgraničiti svoje podatke koji se isporučuju kao Popis navedenog CsvBean predmeta.

Tada možemo nazvati našu metodu writeCsvFromBean () nakon prolaska u željeni put izlazne datoteke:

javni String writeCsvFromBeanExample () {Put puta = Paths.get (ClassLoader.getSystemResource ("csv / writtenBean.csv"). toURI ()); return BeanExamples.writeCsvFromBean (put); }

4. Zaključak

Eto - primjeri sinkronog koda za OpenCSV koristeći grah, CSVReader, i CSVWriter. Službene dokumente pogledajte ovdje.

Kao i uvijek, uzorci koda nalaze se na GitHubu.