Penyusun Univocity

1. Pengenalan

Dalam tutorial ini, kita akan melihat Univocity Parsers, perpustakaan untuk menguraikan fail CSV, TSV, dan lebar tetap di Java dengan cepat.

Kami akan memulakan dengan asas membaca dan menulis fail sebelum beralih ke membaca dan menulis fail ke dan dari kacang Java. Kemudian, kita akan melihat pilihan konfigurasi dengan cepat sebelum menyelesaikannya.

2. Persediaan

Untuk menggunakan penghurai, kita perlu menambahkan kebergantungan Maven terbaru ke fail pom.xml projek kami :

 com.univocity univocity-parsers 2.8.4 

3. Penggunaan Asas

3.1. Membaca

Di Univocity, kita dapat menguraikan seluruh fail dengan cepat ke dalam koleksi array String yang mewakili setiap baris dalam fail.

Pertama, mari kita uraikan fail CSV dengan menyediakan Pembaca ke fail CSV kami ke dalam CsvParser dengan tetapan lalai:

try (Reader inputReader = new InputStreamReader(new FileInputStream( new File("src/test/resources/productList.csv")), "UTF-8")) { CsvParser parser = new CsvParser(new CsvParserSettings()); List parsedRows = parser.parseAll(inputReader); return parsedRows; } catch (IOException e) { // handle exception }

Kita boleh menukar logik ini dengan mudah untuk menguraikan fail TSV dengan beralih ke TsvParser dan memberikannya fail TSV.

Hanya sedikit lebih rumit untuk memproses fail lebar tetap Perbezaan utama adalah bahawa kita perlu memberikan lebar medan kita dalam tetapan penghurai.

Mari baca fail lebar tetap dengan memberikan objek FixedWidthFields ke FixedWidthParserSettings kami :

try (Reader inputReader = new InputStreamReader(new FileInputStream( new File("src/test/resources/productList.txt")), "UTF-8")) { FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10); FixedWidthParserSettings settings = new FixedWidthParserSettings(fieldLengths); FixedWidthParser parser = new FixedWidthParser(settings); List parsedRows = parser.parseAll(inputReader); return parsedRows; } catch (IOException e) { // handle exception }

3.2. Penulisan

Setelah kita membahas membaca fail dengan penghurai, mari belajar bagaimana menulisnya.

Menulis fail sangat serupa dengan membacanya kerana kami menyediakan Penulis bersama dengan tetapan yang kami kehendaki kepada penghurai yang sesuai dengan jenis fail kami.

Mari buat kaedah untuk menulis fail dalam ketiga-tiga format yang mungkin:

public 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 = new CsvWriter(outputWriter, new CsvWriterSettings()); writer.writeRowsAndClose(products); break; case TSV: TsvWriter writer = new TsvWriter(outputWriter, new TsvWriterSettings()); writer.writeRowsAndClose(products); break; case FIXED_WIDTH: FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10); FixedWidthWriterSettings settings = new FixedWidthWriterSettings(fieldLengths); FixedWidthWriter writer = new FixedWidthWriter(outputWriter, settings); writer.writeRowsAndClose(products); break; default: logger.warn("Invalid OutputType: " + outputType); return false; } return true; } catch (IOException e) { // handle exception } }

Seperti membaca fail, menulis fail CSV dan fail TSV hampir sama. Untuk fail lebar tetap, kita harus memberikan lebar medan ke tetapan kita.

3.3. Menggunakan Pemproses Row

Univocity menyediakan sebilangan pemproses baris yang boleh kita gunakan dan juga memberikan kemampuan untuk kita membuat sendiri.

Untuk merasakan penggunaan pemproses baris, mari kita gunakan BatchedColumnProcessor untuk memproses fail CSV yang lebih besar dalam kumpulan lima baris:

try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) { CsvParserSettings settings = new CsvParserSettings(); settings.setProcessor(new BatchedColumnProcessor(5) { @Override public void batchProcessed(int rowsInThisBatch) {} }); CsvParser parser = new CsvParser(settings); List parsedRows = parser.parseAll(inputReader); return parsedRows; } catch (IOException e) { // handle exception }

Untuk menggunakan pemproses baris ini, kami menentukannya dalam CsvParserSettings kami dan kemudian yang perlu kami lakukan ialah memanggil parseAll .

3.4. Membaca dan Menulis ke dalam Kacang Jawa

Senarai array String tidak mengapa, tetapi kami sering menggunakan data dalam kacang Java. Univocity juga membolehkan membaca dan menulis ke dalam kacang Jawa yang diberi penjelasan khas.

Mari tentukan kacang Produk dengan anotasi Univocity:

public class Product { @Parsed(field = "product_no") private String productNumber; @Parsed private String description; @Parsed(field = "unit_price") private float unitPrice; // getters and setters }

Anotasi utama adalah anotasi @Parsed .

Sekiranya tajuk lajur kami sesuai dengan nama bidang, kami dapat menggunakan @Parsed tanpa nilai yang ditentukan. Sekiranya tajuk lajur kami berbeza dengan nama bidang, kami dapat menentukan tajuk lajur menggunakan sifat medan .

Sekarang setelah kami menentukan kacang Produk kami , mari baca fail CSV kami ke dalamnya:

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

Kami mula-mula membina pemproses baris khas, BeanListProcessor, dengan kelas kami yang diberi penjelasan. Kemudian, kami memberikannya kepada CsvParserSettings dan menggunakannya untuk membaca dalam senarai Produk .

Seterusnya, mari tulis senarai Produk kami ke fail lebar tetap:

try (Writer outputWriter = new OutputStreamWriter(new FileOutputStream(new File(outputPath)), "UTF-8")) { BeanWriterProcessor rowProcessor = new BeanWriterProcessor(Product.class); FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10); FixedWidthWriterSettings settings = new FixedWidthWriterSettings(fieldLengths); settings.setHeaders("product_no", "description", "unit_price"); settings.setRowWriterProcessor(rowProcessor); FixedWidthWriter writer = new FixedWidthWriter(outputWriter, settings); writer.writeHeaders(); for (Product product : products) { writer.processRecord(product); } writer.close(); return true; } catch (IOException e) { // handle exception }

Perbezaan yang ketara ialah kami menentukan tajuk lajur kami dalam tetapan kami.

4. Tetapan

Univocity mempunyai sejumlah tetapan yang dapat kita terapkan pada penghurai. Seperti yang kita lihat sebelumnya, kita dapat menggunakan tetapan untuk menerapkan pemproses baris ke penghurai.

Terdapat banyak tetapan lain yang dapat diubah sesuai dengan keperluan kita. Walaupun banyak konfigurasi umum di ketiga jenis fail, setiap penghurai juga mempunyai tetapan khusus format.

Mari sesuaikan tetapan penghurai CSV kami untuk meletakkan beberapa had pada data yang kami baca:

CsvParserSettings settings = new CsvParserSettings(); settings.setMaxCharsPerColumn(100); settings.setMaxColumns(50); CsvParser parser = new CsvParser(new CsvParserSettings());

5. Kesimpulan

Dalam tutorial ringkas ini, kami mempelajari asas-asas menguraikan fail menggunakan perpustakaan Univocity.

Kami belajar membaca dan menulis fail ke dalam senarai array rentetan dan kacang Java. Sebelum, kita masuk ke kacang Java, kita melihat dengan cepat menggunakan pemproses baris yang berbeza. Akhirnya, kami secara ringkas menyentuh cara menyesuaikan tetapan.

Seperti biasa, kod sumber tersedia di GitHub.