Univocity Parsers

1. Inleiding

In deze zelfstudie bekijken we snel Univocity Parsers, een bibliotheek voor het parseren van CSV-, TSV- en bestanden met een vaste breedte in Java.

We beginnen met de basisprincipes van het lezen en schrijven van bestanden voordat we verder gaan met het lezen en schrijven van bestanden van en naar Java Beans. Vervolgens bekijken we snel de configuratie-opties voordat we afronden.

2. Installatie

Om de parsers te gebruiken, moeten we de nieuwste Maven-afhankelijkheid aan ons project toevoegen pom.xml het dossier:

 com.univocity univocity-parsers 2.8.4 

3. Basisgebruik

3.1. Lezing

In Univocity kunnen we snel een heel bestand ontleden in een verzameling Draad arrays die elke regel in het bestand vertegenwoordigen.

Laten we eerst een CSV-bestand ontleden door een Lezer naar ons CSV-bestand in een CsvParser met standaard instellingen:

probeer (Reader inputReader = nieuwe InputStreamReader (nieuwe FileInputStream (nieuw bestand ("src / test / resources / productList.csv")), "UTF-8")) {CsvParser parser = nieuwe CsvParser (nieuwe CsvParserSettings ()); Lijst parsedRows = parser.parseAll (inputReader); retourneer parsedRows; } catch (IOException e) {// handle exception}

We kunnen deze logica eenvoudig omschakelen om een ​​TSV-bestand te ontleden door over te schakelen naar TsvParser en het voorzien van een TSV-bestand.

Het is alleen iets ingewikkelder om een ​​bestand met een vaste breedte te verwerken. Het belangrijkste verschil is dat we onze veldbreedtes moeten opgeven in de parserinstellingen.

Laten we een bestand met vaste breedte lezen door een FixedWidthFields bezwaar maken tegen onze FixedWidthParserSettings:

probeer (Reader inputReader = nieuwe InputStreamReader (nieuwe FileInputStream (nieuw bestand ("src / test / resources / productList.txt")), "UTF-8")) {FixedWidthFields fieldLengths = nieuwe FixedWidthFields (8, 30, 10); FixedWidthParserSettings instellingen = nieuwe FixedWidthParserSettings (fieldLengths); FixedWidthParser parser = nieuwe FixedWidthParser (instellingen); Lijst parsedRows = parser.parseAll (inputReader); retourneer parsedRows; } catch (IOException e) {// handle exception}

3.2. Schrijven

Nu we het lezen van bestanden met de parsers hebben behandeld, gaan we leren hoe we ze kunnen schrijven.

Het schrijven van bestanden lijkt erg op het lezen ervan, omdat we een auteur samen met onze gewenste instellingen naar de parser die overeenkomt met ons bestandstype.

Laten we een methode maken om bestanden in alle drie mogelijke indelingen te schrijven:

openbare 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 = nieuwe CsvWriter (outputWriter, nieuwe CsvWriterSettings ()); writer.writeRowsAndClose (producten); breken; case TSV: TsvWriter writer = nieuwe TsvWriter (outputWriter, nieuwe TsvWriterSettings ()); writer.writeRowsAndClose (producten); breken; geval FIXED_WIDTH: FixedWidthFields fieldLengths = nieuwe FixedWidthFields (8, 30, 10); FixedWidthWriterSettings instellingen = nieuwe FixedWidthWriterSettings (fieldLengths); FixedWidthWriter-schrijver = nieuwe FixedWidthWriter (outputWriter, instellingen); writer.writeRowsAndClose (producten); breken; default: logger.warn ("Invalid OutputType:" + outputType); teruggeven false; } retourneren waar; } catch (IOException e) {// handle exception}}

Net als bij het lezen van bestanden, is het schrijven van CSV-bestanden en TSV-bestanden bijna identiek. Voor bestanden met een vaste breedte moeten we de veldbreedte opgeven voor onze instellingen.

3.3. Rijprocessors gebruiken

Univocity biedt een aantal rijprocessors die we kunnen gebruiken en biedt ons ook de mogelijkheid om onze eigen processors te maken.

Om een ​​idee te krijgen van het gebruik van rijprocessors, gebruiken we de BatchedColumnProcessor om een ​​groter CSV-bestand te verwerken in batches van vijf rijen:

probeer (Reader inputReader = nieuwe InputStreamReader (nieuwe FileInputStream (nieuw bestand (relatievePad)), "UTF-8")) {CsvParserSettings instellingen = nieuwe CsvParserSettings (); settings.setProcessor (nieuwe BatchedColumnProcessor (5) {@Override public void batchProcessed (int rijenInThisBatch) {}}); CsvParser parser = nieuwe CsvParser (instellingen); Lijst parsedRows = parser.parseAll (inputReader); retourneer parsedRows; } catch (IOException e) {// handle exception}

Om deze rijprocessor te gebruiken, definiëren we deze in onze CsvParserSettings en dan hoeven we alleen maar te bellen parseAll.

3.4. Lezen en schrijven in Java Beans

De lijst van Draad arrays is oké, maar we werken vaak met gegevens in Java Beans. Univocity maakt ook het lezen van en schrijven in speciaal geannoteerde Java-bonen mogelijk.

Laten we een Product bean met de Univocity-annotaties:

openbare klasse Product {@Parsed (field = "product_no") privé String productNumber; @Parsed private String beschrijving; @Parsed (field = "unit_price") private float unitPrice; // getters en setters}

De belangrijkste annotatie is de @Parsed annotatie.

Als onze kolomkop overeenkomt met de veldnaam, kunnen we gebruiken @Parsed zonder enige gespecificeerde waarden. Als onze kolomkop verschilt van de veldnaam, kunnen we de kolomkop specificeren met de veld- eigendom.

Nu we onze hebben gedefinieerd Product bean, laten we ons CSV-bestand erin lezen:

probeer (Reader inputReader = nieuwe InputStreamReader (nieuwe FileInputStream (nieuw bestand ("src / test / resources / productList.csv")), "UTF-8")) {BeanListProcessor rowProcessor = nieuwe BeanListProcessor (Product.class); CsvParserSettings-instellingen = nieuwe CsvParserSettings (); settings.setHeaderExtractionEnabled (true); settings.setProcessor (rowProcessor); CsvParser parser = nieuwe CsvParser (instellingen); parser.parse (inputReader); return rowProcessor.getBeans (); } catch (IOException e) {// handle exception}

We hebben eerst een speciale rijprocessor gebouwd, BeanListProcessor, met onze geannoteerde klas. Vervolgens hebben we dat aan de CsvParserSettings en gebruikte het om in een lijst met Products.

Laten we vervolgens onze lijst met Products uit naar een bestand met vaste breedte:

probeer (Writer outputWriter = nieuwe OutputStreamWriter (nieuwe FileOutputStream (nieuw bestand (outputPath)), "UTF-8")) {BeanWriterProcessor rowProcessor = nieuwe BeanWriterProcessor (Product.class); FixedWidthFields fieldLengths = nieuwe FixedWidthFields (8, 30, 10); FixedWidthWriterSettings instellingen = nieuwe FixedWidthWriterSettings (fieldLengths); settings.setHeaders ("product_no", "description", "unit_price"); settings.setRowWriterProcessor (rowProcessor); FixedWidthWriter-schrijver = nieuwe FixedWidthWriter (outputWriter, instellingen); schrijver.writeHeaders (); voor (Productproduct: producten) {writer.processRecord (product); } writer.close (); terugkeer waar; } catch (IOException e) {// handle exception}

Het opmerkelijke verschil is dat we onze kolomkoppen specificeren in onze instellingen.

4. Instellingen

Univocity heeft een aantal instellingen die we kunnen toepassen op de parsers. Zoals we eerder zagen, kunnen we instellingen gebruiken om een ​​rijprocessor toe te passen op de parsers.

Er zijn veel andere instellingen die kunnen worden gewijzigd om aan onze behoeften te voldoen. Hoewel veel van de configuraties gemeenschappelijk zijn voor de drie bestandstypen, heeft elke parser ook indelingsspecifieke instellingen.

Laten we onze CSV-parserinstellingen aanpassen om een ​​aantal limieten te stellen aan de gegevens die we lezen:

CsvParserSettings-instellingen = nieuwe CsvParserSettings (); settings.setMaxCharsPerColumn (100); settings.setMaxColumns (50); CsvParser-parser = nieuwe CsvParser (nieuwe CsvParserSettings ());

5. Conclusie

In deze korte tutorial leerden we de basisprincipes van het parseren van bestanden met behulp van de Univocity-bibliotheek.

We hebben geleerd hoe we bestanden moeten lezen en schrijven in lijsten met string-arrays en Java-bonen. Voordat we met Java Beans begonnen, hebben we snel gekeken naar het gebruik van verschillende rijprocessors. Ten slotte hebben we kort besproken hoe u de instellingen kunt aanpassen.

Zoals altijd is de broncode beschikbaar op GitHub.