Univocity Parsers

1. Introduksjon

I denne opplæringen tar vi en rask titt på Univocity Parsers, et bibliotek for parsing av CSV-, TSV- og filer med fast bredde i Java.

Vi begynner med det grunnleggende om å lese og skrive filer før vi går videre til å lese og skrive filer til og fra Java-bønner. Deretter tar vi en rask titt på konfigurasjonsalternativene før vi pakker inn.

2. Oppsett

For å bruke parsers, må vi legge til den nyeste Maven-avhengigheten til prosjektet vårt pom.xml fil:

 com.univocity univocity-parsers 2.8.4 

3. Grunnleggende bruk

3.1. Lesning

I Univocity kan vi raskt analysere en hel fil i en samling av String matriser som representerer hver linje i filen.

La oss først analysere en CSV-fil ved å gi en Leser til CSV-filen vår til en CsvParser med standardinnstillinger:

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); retur parsedRows; } fange (IOException e) {// håndtak unntak}

Vi kan enkelt bytte denne logikken til å analysere en TSV-fil ved å bytte til TsvParser og gi den en TSV-fil.

Det er bare litt mer komplisert å behandle en fil med fast bredde. Den primære forskjellen er at vi må oppgi feltbredder i parserinnstillingene.

La oss lese en fil med fast bredde ved å gi en FixedWidthFields innvende mot vårt 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 innstillinger = nye FixedWidthParserSettings (fieldLengths); FixedWidthParser parser = ny FixedWidthParser (innstillinger); Liste parsedRows = parser.parseAll (inputReader); retur parsedRows; } fangst (IOException e) {// håndtak unntak}

3.2. Skrive

Nå som vi har dekket lesefiler med parsers, la oss lære å skrive dem.

Å skrive filer ligner veldig på å lese dem ved at vi gir en Forfatter sammen med de ønskede innstillingene til parseren som samsvarer med filtypen vår.

La oss lage en metode for å 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, nye CsvWriterSettings ()); writer.writeRowsAndClose (produkter); gå i stykker; sak TSV: TsvWriter skribent = ny TsvWriter (outputWriter, nye TsvWriterSettings ()); writer.writeRowsAndClose (produkter); gå i stykker; sak FIXED_WIDTH: FixedWidthFields fieldLengths = nye FixedWidthFields (8, 30, 10); FixedWidthWriterSettings-innstillinger = nye FixedWidthWriterSettings (fieldLengths); FixedWidthWriter skribent = ny FixedWidthWriter (outputWriter, innstillinger); writer.writeRowsAndClose (produkter); gå i stykker; standard: logger.warn ("Ugyldig OutputType:" + outputType); returner falsk; } returner sant; } fange (IOException e) {// håndtak unntak}}

Som med lesing av filer er det nesten identisk å skrive CSV-filer og TSV-filer. For filer med fast bredde må vi oppgi feltbredden til innstillingene våre.

3.3. Bruke radprosessorer

Univocity gir en rekke radprosessorer vi kan bruke, og gir oss også muligheten til å lage våre egne.

For å få en følelse av å bruke radprosessorer, la oss bruke BatchColumnProcessor å behandle en større CSV-fil i grupper på fem rader:

prøv (Reader inputReader = new InputStreamReader (new FileInputStream (new File (relativePath)), "UTF-8")) {CsvParserSettings settings = new CsvParserSettings (); settings.setProcessor (ny BatchedColumnProcessor (5) {@Override public void batchProcessed (int rowsInThisBatch) {}}); CsvParser parser = ny CsvParser (innstillinger); Liste parsedRows = parser.parseAll (inputReader); retur parsedRows; } fange (IOException e) {// håndtak unntak}

For å bruke denne radprosessoren definerer vi den i vår CsvParserSettings og så er alt vi trenger å gjøre å ringe parseAll.

3.4. Lese og skrive til Java Beans

Listen over String arrays er ok, men vi jobber ofte med data i Java bønner. Univocity tillater også lesing og skriving i spesielt merkede Java-bønner.

La oss definere en Produkt bønne med Univocity-merknader:

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

Hovedkommentaren er @Parsed kommentar.

Hvis kolonneoverskriften vår samsvarer med feltnavnet, kan vi bruke @Parsed uten noen verdier spesifisert. Hvis kolonneoverskriften vår skiller seg fra feltnavnet, kan vi spesifisere kolonneoverskriften ved hjelp av felt eiendom.

Nå som vi har definert vår Produkt bean, la oss lese CSV-filen vår i den:

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

Vi konstruerte først en spesiell radprosessor, BeanListProsessor, med vår kommenterte klasse. Så ga vi det til CsvParserSettings og brukte den til å lese i en liste over Produkts.

Deretter la oss skrive listen vår over Produkts ut til en fil med fast bredde:

prøv (Writer outputWriter = new OutputStreamWriter (new FileOutputStream (new File (outputPath)), "UTF-8")) {BeanWriterProcessor rowProcessor = new BeanWriterProcessor (Product.class); FixedWidthFields fieldLengths = nye FixedWidthFields (8, 30, 10); FixedWidthWriterSettings-innstillinger = nye FixedWidthWriterSettings (fieldLengths); settings.setHeaders ("produkt_nr", "beskrivelse", "enhetspris"); settings.setRowWriterProcessor (rowProcessor); FixedWidthWriter-skribent = ny FixedWidthWriter (outputWriter, innstillinger); writer.writeHeaders (); for (Produktprodukt: produkter) {writer.processRecord (produkt); } writer.close (); returner sant; } fangst (IOException e) {// håndtak unntak}

Den bemerkelsesverdige forskjellen er at vi spesifiserer kolonneoverskriftene våre i innstillingene våre.

4. Innstillinger

Univocity har en rekke innstillinger vi kan bruke på parsers. Som vi så tidligere, kan vi bruke innstillinger for å bruke en radprosessor på parserne.

Det er mange andre innstillinger som kan endres for å dekke våre behov. Selv om mange av konfigurasjonene er vanlige i de tre filtypene, har hver parser også formatspesifikke innstillinger.

La oss justere CSV-parserinnstillingene våre for å sette noen begrensninger på dataene vi leser:

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

5. Konklusjon

I denne raske opplæringen lærte vi det grunnleggende om å analysere filer ved hjelp av Univocity-biblioteket.

Vi lærte å lese og skrive filer både i lister over strengmatriser og Java-bønner. Før kom vi inn i Java bønner, vi tok en rask titt på å bruke forskjellige radprosessorer. Til slutt berørte vi kort hvordan du kan tilpasse innstillingene.

Som alltid er kildekoden tilgjengelig på GitHub.


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