Raščlanjivači Univocityja

1. Uvod

U ovom ćemo uputstvu na brzinu pogledati Univocity Parsers, knjižnicu za raščlanjivanje CSV, TSV i datoteka fiksne širine na Javi.

Počet ćemo s osnovama čitanja i pisanja datoteka prije nego što prijeđemo na čitanje i pisanje datoteka na i iz Java graha. Zatim ćemo na brzinu pogledati opcije konfiguracije prije zamatanja.

2. Postavljanje

Da bismo koristili parsere, u naš projekt moramo dodati najnoviju ovisnost o Mavenu pom.xml datoteka:

 com.univocity univocity-parsers 2.8.4 

3. Osnovna upotreba

3.1. Čitanje

U Univocityu možemo brzo raščlaniti cijelu datoteku u zbirku Niz nizovi koji predstavljaju svaki redak u datoteci.

Prvo, analizirajmo CSV datoteku davanjem datoteke Čitač u našu CSV datoteku u CsvParser sa zadanim postavkama:

probajte (Reader inputReader = novi InputStreamReader (novi FileInputStream (nova datoteka ("src / test / resources / productList.csv")), "UTF-8")) {CsvParser parser = novi CsvParser (novi CsvParserSettings ()); Popis parsedRows = parser.parseAll (inputReader); povratak parsedRows; } catch (IOException e) {// obrada iznimke}

Ovu logiku možemo lako prebaciti na raščlanjivanje TSV datoteke prebacivanjem na TsvParser i pružanje mu TSV datoteke.

Tek je malo složenije obraditi datoteku fiksne širine. Primarna je razlika u tome što u postavkama raščlanjivača trebamo osigurati širinu polja.

Pročitajmo datoteku fiksne širine davanjem datoteke FixedWidthFields prigovoriti našem FixedWidthParserSettings:

probajte (Reader inputReader = novi InputStreamReader (novi FileInputStream (nova datoteka ("src / test / resources / productList.txt")), "UTF-8")) {FixedWidthFields fieldLengths = novi FixedWidthFields (8, 30, 10); Postavke FixedWidthParserSettings = nove postavke FixedWidthParserSettings (fieldLengths); Analizator FixedWidthParser = novi FixedWidthParser (postavke); Popis parsedRows = parser.parseAll (inputReader); povratak parsedRows; } catch (IOException e) {// obrada iznimke}

3.2. Pisanje

Sad kad smo obradili datoteke za čitanje pomoću parsera, naučimo kako ih pisati.

Pisanje datoteka vrlo je slično čitanju jer pružamo a Pisac zajedno s našim željenim postavkama parsera koji odgovara našoj vrsti datoteke.

Stvorimo metodu za pisanje datoteka u sva tri moguća formata:

public boolean writeData (Popis proizvoda, OutputType outputType, String outputPath) {try (Writer outputWriter = new OutputStreamWriter (new FileOutputStream (new File (outputPath)), "UTF-8")) {switch (outputType) {case CSV: CsvWriter Writer = novi CsvWriter (outputWriter, novi CsvWriterSettings ()); writer.writeRowsAndClose (proizvodi); pauza; slučaj TSV: TsvWriter Writer = novi TsvWriter (outputWriter, novi TsvWriterSettings ()); writer.writeRowsAndClose (proizvodi); pauza; slučaj FIXED_WIDTH: FixedWidthFields fieldLengths = novi FixedWidthFields (8, 30, 10); Postavke FixedWidthWriterSettings = nove postavke FixedWidthWriterSettings (fieldLengths); FixedWidthWriter Writer = novi FixedWidthWriter (outputWriter, postavke); writer.writeRowsAndClose (proizvodi); pauza; zadano: logger.warn ("Neispravan izlazni tip:" + izlazni tip); return false; } return true; } catch (IOException e) {// obrada iznimke}}

Kao i kod čitanja datoteka, pisanje CSV datoteka i TSV datoteka gotovo je identično. Za datoteke fiksne širine, našim postavkama moramo osigurati širinu polja.

3.3. Korištenje redaka

Univocity nudi brojne redovne procesore koje možemo koristiti, a također nam pruža mogućnost stvaranja vlastitih.

Da bismo stekli osjećaj za upotrebu procesora redova, upotrijebimo Proširivač skupljenog stupca za obradu veće CSV datoteke u serijama od pet redaka:

probajte (Reader inputReader = novi InputStreamReader (novi FileInputStream (nova datoteka (relativePath)), "UTF-8")) {CsvParserSettings postavke = novi CsvParserSettings (); settings.setProcessor (novi BatchedColumnProcessor (5) {@Preuzmi javnu void batchProcessed (int redoviInThisBatch) {}}); CsvParser parser = novi CsvParser (postavke); Popis parsedRows = parser.parseAll (inputReader); povratak parsedRows; } catch (IOException e) {// obrada iznimke}

Da bismo koristili ovaj procesor redaka, definiramo ga u našem CsvParserSettings a onda sve što moramo učiniti je nazvati raščlanitiSve.

3.4. Čitanje i pisanje u Java Beans

Popis Niz polja je u redu, ali često radimo s podacima u Java grahu. Univocity također omogućuje čitanje i pisanje u posebno označene Java grah.

Definirajmo a Proizvod grah s napomenama Univocity:

proizvod javne klase {@Parsed (field = "product_no") private String productNumber; @Parsed opis privatnog niza; @Parsed (field = "unit_price") privatni plutajući unitPrice; // geteri i postavljači}

Glavna je napomena @ Raščlanjeno bilješka.

Ako se naslov našeg stupca podudara s imenom polja, možemo ga koristiti @ Raščlanjeno bez ikakvih navedenih vrijednosti. Ako se naslov našeg stupca razlikuje od naziva polja, naslov stupca možemo odrediti pomoću polje imovine.

Sad kad smo definirali svoje Proizvod bean, pročitajmo u njemu našu CSV datoteku:

probajte (Reader inputReader = novi InputStreamReader (novi FileInputStream (nova datoteka ("src / test / resources / productList.csv")), "UTF-8")) {BeanListProcessor rowProcessor = novi BeanListProcessor (Product.class); Postavke CsvParserSettings = novi CsvParserSettings (); settings.setHeaderExtractionEnabled (true); settings.setProcessor (rowProcessor); CsvParser parser = novi CsvParser (postavke); parser.parse (inputReader); vratiti rowProcessor.getBeans (); } catch (IOException e) {// obrada iznimke}

Prvo smo konstruirali specijalni procesor redaka, BeanListProcessor, s našim komentiranim razredom. Zatim smo to osigurali CsvParserSettings i upotrijebio ga za čitanje na popisu Proizvods.

Dalje, napišite svoj popis Proizvods datoteke fiksne širine:

probajte (Writer outputWriter = novi OutputStreamWriter (novi FileOutputStream (nova datoteka (outputPath)), "UTF-8")) {BeanWriterProcessor rowProcessor = novi BeanWriterProcessor (Product.class); FixedWidthFields fieldLengths = novi FixedWidthFields (8, 30, 10); Postavke FixedWidthWriterSettings = nove postavke FixedWidthWriterSettings (fieldLengths); settings.setHeaders ("product_no", "description", "unit_price"); settings.setRowWriterProcessor (rowProcessor); FixedWidthWriter Writer = novi FixedWidthWriter (outputWriter, postavke); writer.writeHeaders (); za (Proizvod proizvoda: proizvodi) {Writer.processRecord (proizvod); } pisac.close (); povratak istinit; } catch (IOException e) {// obrada iznimke}

Značajna razlika je u tome što u svojim postavkama određujemo zaglavlja stupaca.

4. Postavke

Univocity ima brojne postavke koje možemo primijeniti na parsere. Kao što smo vidjeli ranije, pomoću postavki možemo primijeniti procesor redaka na parsere.

Postoje mnoge druge postavke koje se mogu mijenjati prema našim potrebama. Iako su mnoge konfiguracije uobičajene za tri vrste datoteka, svaki parser također ima postavke specifične za format.

Prilagodimo postavke CSV parsera kako bismo postavili neka ograničenja na podatke koje čitamo:

Postavke CsvParserSettings = novi CsvParserSettings (); settings.setMaxCharsPerColumn (100); settings.setMaxColumns (50); CsvParser parser = novi CsvParser (novi CsvParserSettings ());

5. Zaključak

U ovom smo brzom vodiču naučili osnove raščlanjivanja datoteka pomoću biblioteke Univocity.

Naučili smo kako čitati i pisati datoteke na popise nizova nizova i Java grah. Prije nego što smo ušli u Java grah, kratko smo pogledali upotrebu različitih procesora redova. Na kraju smo se ukratko dotaknuli kako prilagoditi postavke.

Kao i uvijek, izvorni kod dostupan je na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found