Univocity Parsers

1. Introduktion

I denne tutorial tager vi et hurtigt kig på Univocity Parsers, et bibliotek til parsing af CSV-, TSV- og filer med fast bredde i Java.

Vi starter med det grundlæggende i læsning og skrivning af filer, inden vi går videre til læsning og skrivning af filer til og fra Java-bønner. Derefter ser vi hurtigt på konfigurationsindstillingerne, inden vi indpakker.

2. Opsætning

For at bruge parserne er vi nødt til at tilføje den nyeste Maven-afhængighed til vores projekt pom.xml fil:

 com.univocity univocity-parsers 2.8.4 

3. Grundlæggende anvendelse

3.1. Læsning

I Univocity kan vi hurtigt analysere en hel fil i en samling af Snor arrays, der repræsenterer hver linje i filen.

Lad os først analysere en CSV-fil ved at give en Læser til vores CSV-fil til en CsvParser med standardindstillinger:

prøv (Reader inputReader = ny InputStreamReader (ny FileInputStream (ny fil ("src / test / resources / productList.csv")), "UTF-8")) {CsvParser parser = ny CsvParser (ny CsvParserSettings ()); Liste parsedRows = parser.parseAll (inputReader); return parsedRows; } fange (IOException e) {// håndtag undtagelse}

Vi kan let skifte denne logik til at analysere en TSV-fil ved at skifte til TsvParser og give den en TSV-fil.

Det er kun lidt mere kompliceret at behandle en fil med fast bredde. Den primære forskel er, at vi skal angive vores feltbredder i parserindstillingerne.

Lad os læse en fil med fast bredde ved at give en FixedWidthFields modsætter sig vores FixedWidthParserSettings:

prøv (Reader inputReader = ny InputStreamReader (ny FileInputStream (ny fil ("src / test / resources / productList.txt")), "UTF-8")) {FixedWidthFields fieldLengths = new FixedWidthFields (8, 30, 10); FixedWidthParserSettings-indstillinger = nye FixedWidthParserSettings (fieldLengths); FixedWidthParser parser = ny FixedWidthParser (indstillinger); Liste parsedRows = parser.parseAll (inputReader); return parsedRows; } fange (IOException e) {// håndtag undtagelse}

3.2. Skrivning

Nu hvor vi har dækket læsning af filer med parserne, lad os lære at skrive dem.

Skrivning af filer minder meget om at læse dem, da vi leverer en Forfatter sammen med vores ønskede indstillinger til parseren, der matcher vores filtype.

Lad os oprette en metode til at skrive filer i alle tre mulige formater:

public boolean writeData (Listeprodukter, OutputType outputType, String outputPath) {try (Writer outputWriter = new OutputStreamWriter (new FileOutputStream (new File (outputPath)), "UTF-8")) {switch (outputType) {case CSV: CsvWriter writer = ny CsvWriter (outputWriter, ny CsvWriterSettings ()); writer.writeRowsAndClose (produkter); pause; sag TSV: TsvWriter forfatter = ny TsvWriter (outputWriter, ny TsvWriterSettings ()); writer.writeRowsAndClose (produkter); pause; sag FIXED_WIDTH: FixedWidthFields fieldLengths = nye FixedWidthFields (8, 30, 10); FixedWidthWriterSettings-indstillinger = nye FixedWidthWriterSettings (fieldLengths); FixedWidthWriter-forfatter = ny FixedWidthWriter (outputWriter, indstillinger); writer.writeRowsAndClose (produkter); pause; standard: logger.warn ("Ugyldig OutputType:" + outputType); returner falsk; } returner sandt } fangst (IOException e) {// håndtag undtagelse}}

Som med læsning af filer er skrivning af CSV-filer og TSV-filer næsten identiske. For filer med fast bredde skal vi angive feltbredden til vores indstillinger.

3.3. Brug af rækkeprocessorer

Univocity giver et antal række processorer, vi kan bruge, og giver os også mulighed for at skabe vores egne.

For at få en fornemmelse af at bruge rækkeprocessorer, lad os bruge BatchColumnProcessor at behandle en større CSV-fil i batcher på fem rækker:

prøv (Reader inputReader = ny InputStreamReader (ny FileInputStream (ny fil (relativePath)), "UTF-8")) {CsvParserSettings indstillinger = nye CsvParserSettings (); settings.setProcessor (ny BatchedColumnProcessor (5) {@Override public void batchProcessed (int rowsInThisBatch) {}}); CsvParser parser = ny CsvParser (indstillinger); Liste parsedRows = parser.parseAll (inputReader); return parsedRows; } fange (IOException e) {// håndtag undtagelse}

For at bruge denne rækkeprocessor definerer vi det i vores CsvParserSettings og så er alt, hvad vi skal gøre, at ringe parseAlle.

3.4. Læsning og skrivning i Java Beans

Listen over Snor arrays er i orden, men vi arbejder ofte med data i Java bønner. Univocity giver også mulighed for at læse og skrive i specielt kommenterede Java-bønner.

Lad os definere en Produkt bønne med Univocity-kommentarerne:

offentlig klasse Produkt {@Parsed (field = "product_no") privat String productNumber; @Parsed privat strengbeskrivelse; @Parsed (field = "unit_price") privat float unitPrice; // getters og setters}

Den vigtigste kommentar er @Parsed kommentar.

Hvis vores kolonneoverskrift matcher feltnavnet, kan vi bruge @Parsed uden nogen angivne værdier. Hvis vores kolonneoverskrift adskiller sig fra feltnavnet, kan vi specificere kolonneoverskriften ved hjælp af Mark ejendom.

Nu hvor vi har defineret vores Produkt bean, lad os læse vores CSV-fil i den:

prøv (Reader inputReader = ny InputStreamReader (ny FileInputStream (ny fil ("src / test / resources / productList.csv")), "UTF-8")) {BeanListProcessor rowProcessor = ny BeanListProcessor (Product.class); CsvParserSettings indstillinger = nye CsvParserSettings (); settings.setHeaderExtractionEnabled (true); settings.setProcessor (rækkeProcessor); CsvParser parser = ny CsvParser (indstillinger); parser.parse (inputReader); return rowProcessor.getBeans (); } fange (IOException e) {// håndtag undtagelse}

Vi konstruerede først en speciel rækkeprocessor, BeanListProcessor, med vores kommenterede klasse. Derefter leverede vi det til CsvParserSettings og brugte den til at læse i en liste over Produkts.

Lad os derefter skrive vores liste over Produkts ud til en fil med fast bredde:

prøv (Writer outputWriter = ny OutputStreamWriter (ny FileOutputStream (ny fil (outputPath)), "UTF-8")) {BeanWriterProcessor rowProcessor = ny BeanWriterProcessor (Product.class); FixedWidthFields fieldLengths = nye FixedWidthFields (8, 30, 10); FixedWidthWriterSettings-indstillinger = nye FixedWidthWriterSettings (fieldLengths); settings.setHeaders ("product_no", "description", "unit_price"); settings.setRowWriterProcessor (rækkeProcessor); FixedWidthWriter-forfatter = ny FixedWidthWriter (outputWriter, indstillinger); writer.writeHeaders (); for (Produktprodukt: produkter) {writer.processRecord (produkt); } writer.close (); returner sandt; } fange (IOException e) {// håndtag undtagelse}

Den bemærkelsesværdige forskel er, at vi specificerer vores kolonneoverskrifter i vores indstillinger.

4. Indstillinger

Univocity har en række indstillinger, som vi kan anvende på parsers. Som vi så tidligere, kan vi bruge indstillinger til at anvende en rækkeprocessor til parserne.

Der er mange andre indstillinger, der kan ændres, så de passer til vores behov. Selvom mange af konfigurationerne er almindelige på tværs af de tre filtyper, har hver parser også formatspecifikke indstillinger.

Lad os justere vores CSV-parserindstillinger for at sætte nogle begrænsninger for de data, vi læser:

CsvParserSettings indstillinger = nye CsvParserSettings (); settings.setMaxCharsPerColumn (100); settings.setMaxColumns (50); CsvParser parser = ny CsvParser (ny CsvParserSettings ());

5. Konklusion

I denne hurtige vejledning lærte vi det grundlæggende ved parsing af filer ved hjælp af Univocity-biblioteket.

Vi lærte at læse og skrive filer både i lister over strengarrays og Java bønner. Før kom vi ind i Java bønner, vi kiggede hurtigt på at bruge forskellige række processorer. Endelig berørte vi kort hvordan man tilpasser indstillingerne.

Som altid er kildekoden tilgængelig på GitHub.


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