Univocity Parsers

1. Bemutatkozás

Ebben az oktatóanyagban gyorsan megnézzük az Univocity Parsers könyvtárat, a CSV, TSV és fix szélességű fájlok Java elemzésére szolgáló könyvtárat.

Először a fájlok olvasásának és írásának alapjaival kezdünk, mielőtt továbblépnénk a fájlok olvasására és írására a Java-babok között. Ezután gyorsan áttekintjük a konfigurációs lehetőségeket, mielőtt becsomagoljuk.

2. Beállítás

A parserek használatához hozzá kell adnunk a legújabb Maven-függőséget a projektünkhöz pom.xml fájl:

 com.univocity univocity-parsers 2.8.4 

3. Alapvető használat

3.1. Olvasás

Az Univocity-ben gyorsan elemezhetünk egy teljes fájlt egy gyűjteménybe Húr tömbök, amelyek a fájl minden sorát képviselik.

Először elemezzünk egy CSV-fájlt a Olvasó CSV fájlunkba a CsvParser alapértelmezett beállításokkal:

próbáld meg (Reader inputReader = new InputStreamReader (új FileInputStream (új File ("src / test / resources / productList.csv")), "UTF-8")) {CsvParser parser = új CsvParser (új CsvParserSettings ()); ParsedRows = parser.parseAll (inputReader); return parsedRows; } catch (IOException e) {// kivétel kezelése}

Könnyen átválthatjuk ezt a logikát egy TSV fájl elemzésére a következőre váltással: TsvParser és TSV fájllal ellátva.

A fix szélességű fájlok feldolgozása csak kissé bonyolultabb. Az elsődleges különbség az, hogy a mezőszélességünket meg kell adnunk az elemző beállításaiban.

Olvassunk egy rögzített szélességű fájlt a FixedWidthFields kifogásolni a mi FixedWidthParserSettings:

próbáld meg (Reader inputReader = new InputStreamReader (új FileInputStream (új File ("src / test / resources / productList.txt")), "UTF-8")) {FixedWidthFields fieldLengths = new FixedWidthFields (8, 30, 10); FixedWidthParserSettings settings = new FixedWidthParserSettings (fieldLengths); FixedWidthParser parser = új FixedWidthParser (beállítások); ParsedRows = parser.parseAll (inputReader); return parsedRows; } catch (IOException e) {// kivétel kezelése}

3.2. Írás

Most, hogy áttekintettük a fájlok olvasását a parserekkel, tanuljuk meg, hogyan kell írni.

A fájlok írása nagyon hasonlít azok elolvasásához, mivel a Író a kívánt beállításokkal együtt a fájltípusunknak megfelelő elemzőhöz.

Hozzunk létre egy módszert fájlok írására mindhárom lehetséges formátumban:

public boolean writeData (Termékek listázása, OutputType outputType, String outputPath) {try (Writer outputWriter = új OutputStreamWriter (új FileOutputStream (új File (outputPath)), "UTF-8")) {switch (outputType) {eset CSV: CsvWriter író = új CsvWriter (outputWriter, új CsvWriterSettings ()); író.writeRowsAndClose (termékek); szünet; TSV eset: TsvWriter író = új TsvWriter (outputWriter, új TsvWriterSettings ()); író.writeRowsAndClose (termékek); szünet; eset FIXED_WIDTH: FixedWidthFields fieldLengths = new FixedWidthFields (8, 30, 10); FixedWidthWriterSettings settings = new FixedWidthWriterSettings (fieldLengths); FixedWidthWriter író = új FixedWidthWriter (outputWriter, beállítások); író.writeRowsAndClose (termékek); szünet; alapértelmezett: logger.warn ("Érvénytelen OutputType:" + outputType); return false; } return true; } catch (IOException e) {// kivétel kezelése}}

A fájlok olvasásához hasonlóan a CSV és a TSV fájlok írása is közel azonos. Rögzített szélességű fájlok esetén meg kell adnunk a mező szélességét a beállításoknak.

3.3. Soros processzorok használata

Az Univocity számos soros processzort kínál, amelyeket használhatunk, és lehetőséget nyújt számunkra saját készítésre is.

A soros processzorok használatának érzéséhez használjuk a BatchedColumnProcessor nagyobb CSV-fájl feldolgozása öt soros kötegekben:

próbáld meg (Reader inputReader = new InputStreamReader (új FileInputStream (új File (relatívPath)), "UTF-8")) {CsvParserSettings beállítások = új CsvParserSettings (); settings.setProcessor (new BatchedColumnProcessor (5) {@Orride public void batchProcessed (int rowsInThisBatch) {}}); CsvParser parser = új CsvParser (beállítások); ParsedRows = parser.parseAll (inputReader); return parsedRows; } catch (IOException e) {// kivétel kezelése}

Ennek a soros processzornak a használatához definiáljuk a CsvParserSettings és akkor már csak hívnunk kell parseAll.

3.4. Olvasás és írás Java Beans-be

A Húr tömbök rendben vannak, de gyakran Java-adatokkal dolgozunk. Az univocity lehetővé teszi a speciálisan jegyzetekkel ellátott Java-babokba történő olvasást és írást is.

Határozzuk meg a Termék bab az Univocity kommentárokkal:

public class Termék {@Parsed (field = "product_no") private String termékNumber; @Parsed private String leírás; @Parsed (mező = "unit_price") privát float unitPrice; // szerelők és beállítók}

A fő megjegyzés a @Parsed annotáció.

Ha oszlopunk címsora megegyezik a mező nevével, használhatjuk @Parsed értékek nélkül. Ha oszlopfejlécünk eltér a mezőnévtől, akkor az oszlopfejlécet a terület ingatlan.

Most, hogy meghatároztuk a dolgunkat Termék bab, olvassuk bele a CSV fájlunkat:

próbáld meg (Reader inputReader = new InputStreamReader (új FileInputStream (új File ("src / test / resources / productList.csv")), "UTF-8")) {BeanListProcessor rowProcessor = new BeanListProcessor (Product.class); CsvParserSettings beállítások = new CsvParserSettings (); settings.setHeaderExtractionEnabled (true); settings.setProcessor (rowProcessor); CsvParser parser = új CsvParser (beállítások); parser.parse (inputReader); return rowProcessor.getBeans (); } catch (IOException e) {// kivétel kezelése}

Először készítettünk egy speciális soros processzort, BeanListProcessor, jegyzetelt osztályunkkal. Aztán ezt biztosítottuk a CsvParserSettings és arra használta, hogy elolvassa a Terméks.

Ezután írjuk meg a listánkat Termékrögzített szélességű fájlba:

try (Writer outputWriter = new OutputStreamWriter (új FileOutputStream (új File (outputPath)), "UTF-8")) {BeanWriterProcessor rowProcessor = új BeanWriterProcessor (Product.class); FixedWidthFields fieldLengths = új FixedWidthFields (8, 30, 10); FixedWidthWriterSettings settings = new FixedWidthWriterSettings (fieldLengths); settings.setHeaders ("product_no", "description", "unit_price"); settings.setRowWriterProcessor (rowProcessor); FixedWidthWriter író = új FixedWidthWriter (outputWriter, beállítások); író.írjaHeaders (); for (Terméktermék: termékek) {író.processRecord (termék); } író.zárja (); return true; } catch (IOException e) {// kivétel kezelése}

A figyelemre méltó különbség az, hogy a beállításokban megadjuk az oszlopfejléceket.

4. Beállítások

Az Univocity számos beállítással rendelkezik, amelyeket alkalmazhatunk a parserekre. Mint korábban láttuk, a beállítások segítségével alkalmazhatunk egy soros processzort a parserekre.

Számos egyéb beállítás módosítható igényeinknek megfelelően. Bár a konfigurációk közül sok a három fájltípusban közös, mindegyik elemző formátum-specifikus beállításokkal is rendelkezik.

Módosítsuk a CSV-értelmező beállításait, hogy bizonyos korlátokat szabjunk az olvasott adatokra:

CsvParserSettings beállítások = new CsvParserSettings (); settings.setMaxCharsPerColumn (100); settings.setMaxColumns (50); CsvParser parser = új CsvParser (új CsvParserSettings ());

5. Következtetés

Ebben a gyors bemutatóban megtanultuk a fájlok elemzésének alapjait az Univocity könyvtár segítségével.

Megtanultuk, hogyan kell fájlokat írni és írni a string tömbök listájába és a Java babokba. Előtte Java babokba kerültünk, gyorsan átnéztük a különböző soros processzorokat. Végül röviden kitértünk a beállítások testreszabására.

Mint mindig, a forráskód is elérhető a GitHubon.