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.