Univocity Parsers

1. Úvod

V tomto výučbe sa rýchlo pozrieme na Univocity Parsers, knižnicu na analýzu súborov CSV, TSV a súborov s pevnou šírkou v Jave.

Začneme so základmi čítania a zápisu súborov, skôr ako prejdeme k čítaniu a zápisu súborov do az fazule Java. Potom sa najskôr pozrieme na možnosti konfigurácie.

2. Inštalácia

Ak chcete použiť parsery, musíme do nášho projektu pridať najnovšiu závislosť Maven pom.xml spis:

 com.univocity univocity-parsers 2.8.4 

3. Základné použitie

3.1. Čítanie

V Univocity môžeme rýchlo analyzovať celý súbor do zbierky String polia, ktoré predstavujú každý riadok v súbore.

Najskôr analyzujeme súbor CSV poskytnutím súboru Čitateľ do nášho súboru CSV do a CsvParser s predvoleným nastavením:

try (Reader inputReader = new InputStreamReader (new FileInputStream (new File ("src / test / resources / productList.csv")), "UTF-8")) {CsvParser parser = new CsvParser (new CsvParserSettings ()); Zoznam parsedRows = parser.parseAll (inputReader); návrat parsedRows; } catch (IOException e) {// handle exception}

Túto logiku môžeme ľahko prepnúť na parsovanie súboru TSV prepnutím na TsvParser a poskytnutie súboru TSV.

Spracovanie súboru s pevnou šírkou je len o niečo komplikovanejšie. Primárny rozdiel je v tom, že v nastaveniach syntaktického analyzátora musíme zadať šírku poľa.

Poďme si prečítať súbor s pevnou šírkou poskytnutím a FixedWidthFields namietať proti nášmu FixedWidthParserSettings:

try (Reader inputReader = new InputStreamReader (new FileInputStream (new File ("src / test / resources / productList.txt")), "UTF-8")) {FixedWidthFields fieldLengths = new FixedWidthFields (8, 30, 10); Nastavenia FixedWidthParserSettings = nové FixedWidthParserSettings (fieldLengths); FixedWidthParser parser = nový FixedWidthParser (nastavenia); Zoznam parsedRows = parser.parseAll (inputReader); návrat parsedRows; } catch (IOException e) {// handle exception}

3.2. Písanie

Teraz, keď sme čítali súbory analyzátormi, naučme sa ich písať.

Zápis súborov je veľmi podobný ich čítaniu, keď poskytujeme a Spisovateľ spolu s požadovaným nastavením analyzátora, ktorý zodpovedá nášmu typu súboru.

Vytvorme metódu zápisu súborov vo všetkých troch možných formátoch:

public boolean writeData (List products, OutputType outputType, String outputPath) {try (Writer outputWriter = new OutputStreamWriter (new FileOutputStream (new File (outputPath)), "UTF-8")) {switch (outputType) {case CSV: CsvWriter writer = nový CsvWriter (outputWriter, nový CsvWriterSettings ()); writer.writeRowsAndClose (produkty); prestávka; prípad TSV: zapisovač TsvWriter = nový TsvWriter (outputWriter, nový TsvWriterSettings ()); writer.writeRowsAndClose (produkty); prestávka; case FIXED_WIDTH: FixedWidthFields fieldLengths = new FixedWidthFields (8, 30, 10); Nastavenia FixedWidthWriterSettings = nové FixedWidthWriterSettings (fieldLengths); FixedWidthWriter spisovateľ = nový FixedWidthWriter (outputWriter, nastavenia); writer.writeRowsAndClose (produkty); prestávka; predvolené: logger.warn ("Neplatný typ výstupu:" + výstupný typ); návrat nepravdivý; } návrat pravdivý; } catch (IOException e) {// handle exception}}

Rovnako ako pri čítaní súborov, aj zápis súborov CSV a TSV je takmer totožný. Pre súbory s pevnou šírkou musíme svojim nastaveniam poskytnúť šírku poľa.

3.3. Používanie riadkových procesorov

Univocity poskytuje množstvo riadkových procesorov, ktoré môžeme použiť, a tiež nám umožňuje vytvárať si vlastné.

Ak sa chcete dozvedieť viac o používaní riadkových procesorov, použite znak BatchedColumnProcessor na spracovanie väčšieho súboru CSV v dávkach po piatich riadkoch:

try (Reader inputReader = new InputStreamReader (new FileInputStream (new File (relativePath)), "UTF-8")) {CsvParserSettings settings = new CsvParserSettings (); settings.setProcessor (nový BatchedColumnProcessor (5) {@Override public void batchProcessed (int linesInThisBatch) {}}); CsvParser parser = nový CsvParser (nastavenia); Zoznam parsedRows = parser.parseAll (inputReader); návrat parsedRows; } catch (IOException e) {// handle exception}

Ak chcete použiť tento riadkový procesor, definujeme ho v našom CsvParserSettings a potom už zostáva iba zavolať analyzovať všetko.

3.4. Čítanie a zápis do Java Beans

Zoznam String polia sú v poriadku, ale často pracujeme s údajmi v Java fazuľa. Univocity tiež umožňuje čítanie a písanie do špeciálne anotovaných Java bôbov.

Definujme a Výrobok fazuľa s anotáciami Univocity:

verejná trieda Produkt {@Parsed (field = "product_no") private String productNumber; @Parated private String description; @Parsed (field = "unit_price") private float unitPrice; // zakladatelia a zakladatelia}

Hlavná anotácia je @Parsed anotácia.

Ak sa náš nadpis stĺpca zhoduje s názvom poľa, môžeme použiť @Parsed bez akýchkoľvek špecifikovaných hodnôt. Ak sa náš nadpis stĺpca líši od názvu poľa, môžeme určiť hlavičku stĺpca pomocou lúka nehnuteľnosť.

Teraz, keď sme si zadefinovali svoje Výrobok bean, prečítajme si do toho náš súbor CSV:

try (Reader inputReader = new InputStreamReader (new FileInputStream (new File ("src / test / resources / productList.csv")), "UTF-8")) {BeanListProcessor rowProcessor = new BeanListProcessor (Product.class); Nastavenia CsvParserSettings = nový CsvParserSettings (); settings.setHeaderExtractionEnabled (true); settings.setProcessor (rowProcessor); CsvParser parser = nový CsvParser (nastavenia); parser.parse (inputReader); return rowProcessor.getBeans (); } catch (IOException e) {// handle exception}

Najprv sme skonštruovali špeciálny riadkový procesor, BeanListProcessor, s našou komentovanou triedou. Potom sme to poskytli CsvParserSettings a použil ju na čítanie v zozname Výroboks.

Ďalej spíšeme náš zoznam Výrobokje vydaný do súboru s pevnou šírkou:

try (Writer outputWriter = new OutputStreamWriter (new FileOutputStream (new File (outputPath)), "UTF-8")) {BeanWriterProcessor rowProcessor = new BeanWriterProcessor (Product.class); FixedWidthFields fieldLengths = nové FixedWidthFields (8, 30, 10); Nastavenia FixedWidthWriterSettings = nové FixedWidthWriterSettings (fieldLengths); settings.setHeaders ("product_no", "description", "unit_price"); settings.setRowWriterProcessor (rowProcessor); FixedWidthWriter spisovateľ = nový FixedWidthWriter (outputWriter, nastavenia); writer.writeHeaders (); pre (Produktový produkt: produkty) {writer.processRecord (produkt); } writer.close (); návrat pravdivý; } catch (IOException e) {// handle exception}

Pozoruhodný rozdiel je v tom, že v našich nastaveniach určujeme hlavičky stĺpcov.

4. Nastavenia

Univocity má množstvo nastavení, ktoré môžeme použiť na analyzátory. Ako sme videli skôr, pomocou nastavení môžeme na parsery aplikovať riadkový procesor.

Existuje mnoho ďalších nastavení, ktoré je možné zmeniť tak, aby vyhovovali našim potrebám. Aj keď je veľa konfigurácií spoločné pre všetky tri typy súborov, každý syntaktický analyzátor má aj špecifické nastavenia formátu.

Upravme nastavenia analyzátora CSV tak, aby sme obmedzili čítané údaje:

Nastavenia CsvParserSettings = nový CsvParserSettings (); settings.setMaxCharsPerColumn (100); settings.setMaxColumns (50); CsvParser parser = nový CsvParser (nový CsvParserSettings ());

5. Záver

V tomto rýchlom výučbe sme sa naučili základy analýzy súborov pomocou knižnice Univocity.

Naučili sme sa, ako čítať a zapisovať súbory do zoznamov reťazcových polí a fazule Java. Predtým, ako sme sa dostali k Java beanom, sme sa rýchlo pozreli na použitie rôznych radových procesorov. Nakoniec sme sa krátko dotkli spôsobu prispôsobenia nastavení.

Ako vždy, zdrojový kód je k dispozícii na GitHub.


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