Univocity Parsers

1. Perkenalan

Dalam tutorial ini, kita akan melihat sekilas Univocity Parsers, perpustakaan untuk mengurai CSV, TSV, dan file lebar tetap di Java.

Kami akan mulai dengan dasar-dasar membaca dan menulis file sebelum melanjutkan ke membaca dan menulis file ke dan dari kacang Java. Kemudian, kita akan melihat sekilas opsi konfigurasi sebelum menutupnya.

2. Penyiapan

Untuk menggunakan parser, kita perlu menambahkan dependensi Maven terbaru ke file pom.xml proyek kita :

 com.univocity univocity-parsers 2.8.4 

3. Penggunaan Dasar

3.1. Bacaan

Di Univocity, kita dapat dengan cepat mengurai seluruh file menjadi kumpulan array String yang mewakili setiap baris dalam file.

Pertama, mari parse file CSV dengan menyediakan Pembaca ke file CSV kita ke dalam CsvParser dengan pengaturan default:

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 dapat dengan mudah mengganti logika ini untuk mengurai file TSV dengan beralih ke TsvParser dan menyediakannya dengan file TSV.

Hanya sedikit lebih rumit untuk memproses file dengan lebar tetap. Perbedaan utamanya adalah kita perlu menyediakan lebar bidang kita di pengaturan parser.

Mari kita membaca file dengan lebar tetap dengan menyediakan objek FixedWidthFields ke FixedWidthParserSettings kita :

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

Sekarang kita telah membahas membaca file dengan parser, mari pelajari cara menulisnya.

Menulis file sangat mirip dengan membacanya karena kami menyediakan Writer bersama dengan setelan yang kami inginkan ke parser yang cocok dengan jenis file kami.

Mari buat metode untuk menulis file dalam ketiga format yang memungkinkan:

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 halnya membaca file, menulis file CSV dan file TSV hampir identik. Untuk file dengan lebar tetap, kami harus menyediakan lebar bidang ke pengaturan kami.

3.3. Menggunakan Prosesor Baris

Univocity menyediakan sejumlah prosesor baris yang dapat kita gunakan dan juga menyediakan kemampuan bagi kita untuk membuat sendiri.

Untuk merasakan penggunaan prosesor baris, mari gunakan BatchedColumnProcessor untuk memproses file 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 prosesor baris ini, kami mendefinisikannya di CsvParserSettings kami dan kemudian yang harus kami lakukan adalah memanggil parseAll .

3.4. Membaca dan Menulis ke Java Beans

Daftar array String baik-baik saja, tetapi kami sering bekerja dengan data dalam kacang Java. Univocity juga memungkinkan untuk membaca dan menulis ke dalam kacang Java beranotasi khusus.

Mari tentukan Product bean 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 .

Jika judul kolom kami cocok dengan nama bidang, kami dapat menggunakan @Parsed tanpa nilai yang ditentukan. Jika kolom kami menuju berbeda dari nama field kita dapat menentukan judul kolom menggunakan bidang properti.

Sekarang kita telah mendefinisikan Product bean kita, mari kita baca file CSV kita 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 pertama kali membuat prosesor baris khusus, BeanListProcessor, dengan kelas beranotasi kami. Kemudian, kami menyediakannya ke CsvParserSettings dan menggunakannya untuk membaca dalam daftar Produk .

Selanjutnya, mari kita tulis daftar Produk kita ke file dengan 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 }

Perbedaan yang mencolok adalah kami menentukan tajuk kolom kami di pengaturan kami.

4. Pengaturan

Univocity memiliki sejumlah pengaturan yang dapat kita terapkan pada parser. Seperti yang kita lihat sebelumnya, kita dapat menggunakan pengaturan untuk menerapkan prosesor baris ke parser.

Ada banyak pengaturan lain yang bisa diubah sesuai dengan kebutuhan kita. Meskipun banyak dari konfigurasi yang umum di ketiga jenis file tersebut, setiap parser juga memiliki pengaturan khusus format.

Mari sesuaikan pengaturan parser CSV kita untuk membatasi data yang kita baca:

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

5. Kesimpulan

Dalam tutorial singkat ini, kami mempelajari dasar-dasar penguraian file menggunakan pustaka Univocity.

Kami belajar bagaimana membaca dan menulis file ke dalam daftar array string dan kacang Java. Sebelumnya, kami masuk ke Java beans, kami melihat sekilas penggunaan prosesor baris yang berbeda. Akhirnya, kami secara singkat menyentuh tentang cara menyesuaikan pengaturan.

Seperti biasa, kode sumber tersedia di GitHub.