Pengantar OpenCSV

1. Perkenalan

Artikel singkat ini memperkenalkan OpenCSV 4, perpustakaan yang fantastis untuk menulis, membaca, membuat serial, deserialisasi, dan / atau mem-parsing file .csv ! Di bawah ini, kita akan membahas beberapa contoh yang mendemonstrasikan cara menyiapkan dan menggunakan OpenCSV 4 untuk usaha Anda.

2. Pengaturan

Berikut cara menambahkan OpenCSV ke proyek Anda melalui dependensi pom.xml :

 com.opencsv opencsv 4.1  

The Guci untuk OpenCSV dapat ditemukan di situs resmi atau melalui pencarian cepat selama di Maven Repository.

File .csv kami akan sangat sederhana, kami akan menyimpannya di dua kolom dan empat baris:

colA, ColB A, B C, D G, G G, F

3. To Bean or Not to Bean

Setelah menambahkan OpenCSV ke pom.xml Anda , kami dapat menerapkan metode penanganan CSV dengan dua cara yang mudah:

  1. menggunakan objek CSVReader dan CSVWriter yang praktis (untuk operasi yang lebih sederhana) atau
  2. menggunakan CsvToBean untuk mengonversi file .csv menjadi kacang (yang diimplementasikan sebagai objek java-old beranotasi ).

Kami akan tetap menggunakan contoh sinkron (atau pemblokiran ) untuk artikel ini sehingga kami dapat fokus pada dasar-dasarnya.

Ingat, metode sinkron akan mencegah kode sekitarnya atau kode berikutnya dijalankan hingga selesai. Setiap lingkungan produksi kemungkinan akan menggunakan metode asinkron atau ( non-pemblokiran ) yang akan memungkinkan proses atau metode lain selesai sementara metode asinkron selesai.

Kami akan mempelajari contoh asinkron untuk OpenCSV di artikel mendatang.

3.1. The CSVReader

CSVReader - melalui metode readAll () dan readNext () yang disediakan ! Mari kita lihat cara menggunakan readAll () secara sinkron:

public List readAll(Reader reader) throws Exception { CSVReader csvReader = new CSVReader(reader); List list = new ArrayList(); list = csvReader.readAll(); reader.close(); csvReader.close(); return list; }

Kemudian kita bisa memanggil metode itu dengan meneruskan BufferedReader :

public String readAllExample() throws Exception { Reader reader = Files.newBufferedReader(Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())); return CsvReaderExamples.readAll(reader).toString(); }

Demikian pula, kita bisa mengabstraksi readNext () yang membaca baris demi baris .csv yang disediakan :

public List oneByOne(Reader reader) throws Exception { List list = new ArrayList(); CSVReader csvReader = new CSVReader(reader); String[] line; while ((line = csvReader.readNext()) != null) { list.add(line); } reader.close(); csvReader.close(); return list; }

Dan kita bisa memanggil metode itu di sini dengan meneruskan BufferReader:

public String oneByOneExample() throws Exception { Reader reader = Files.newBufferedReader(Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())); return CsvReaderExamples.oneByOne(reader).toString(); } 

Untuk fleksibilitas yang lebih besar dan opsi konfigurasi, Anda dapat menggunakan CSVReaderBuilder sebagai alternatif :

CSVParser parser = new CSVParserBuilder() .withSeparator(',') .withIgnoreQuotations(true) .build(); CSVReader csvReader = new CSVReaderBuilder(reader) .withSkipLines(0) .withCSVParser(parser) .build();

CSVReaderBuilder memungkinkan seseorang melewati tajuk kolom dan menyetel aturan penguraian melalui CSVParserBuilder .

Dengan menggunakan CSVParserBuilder , kita dapat memilih pemisah kolom khusus, mengabaikan atau menangani tanda kutip, menyatakan bagaimana kita akan menangani bidang null, dan cara menafsirkan karakter yang lolos. Untuk informasi lebih lanjut tentang pengaturan konfigurasi ini, silakan merujuk ke dokumen spesifikasi resmi.

Seperti biasa, harap ingat untuk menutup semua Pembaca Anda untuk mencegah kebocoran memori!

3.2. The CSVWriter

CSVWriter juga menyediakan kemampuan untuk menulis ke file .csv sekaligus atau baris demi baris.

Mari kita lihat cara menulis ke .csv baris demi baris:

public String csvWriterOneByOne(List stringArray, Path path) throws Exception { CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); for (String[] array : stringArray) { writer.writeNext(array); } writer.close(); return Helpers.readFile(path); } 

Sekarang, mari tentukan di mana kita ingin menyimpan file itu dan memanggil metode yang baru kita tulis:

public String csvWriterOneByOne() throws Exception{ Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenOneByOne.csv").toURI()); return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path); }

Kami juga dapat menulis kami .csv sekaligus dengan melewati dalam Daftar dari String array yang mewakili baris kami .csv . :

public String csvWriterAll(List stringArray, Path path) throws Exception { CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); writer.writeAll(stringArray); writer.close(); return Helpers.readFile(path); }

Dan inilah cara kami menyebutnya:

public String csvWriterAll() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenAll.csv").toURI()); return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path); }

Itu dia!

3.3. Bacaan Berbasis Kacang

OpenCSV dapat membuat serial file .csv menjadi skema yang telah ditetapkan dan dapat digunakan kembali yang diimplementasikan sebagai kacang pojo Java beranotasi . CsvToBean dibuat menggunakan CsvToBeanBuilder . Mulai OpenCSV 4, CsvToBeanBuilder adalah cara yang disarankan untuk bekerja dengan com.opencsv.bean.CsvToBean.

Berikut kacang sederhana yang dapat kita gunakan untuk membuat serial .csv dua kolom kita dari bagian 2 .:

public class SimplePositionBean { @CsvBindByPosition(position = 0) private String exampleColOne; @CsvBindByPosition(position = 1) private String exampleColTwo; // getters and setters } 

Setiap kolom di file .csv dikaitkan dengan bidang di kacang. Pemetaan antara tajuk kolom .csv dapat dilakukan menggunakan @CsvBindByPosition atau anotasi @CsvBindByName yang masing-masing menentukan pemetaan menurut posisi atau pencocokan string tajuk.

Pertama, mari buat superclass yang disebut CsvBean - ini akan memungkinkan kita untuk menggunakan kembali dan menggeneralisasi metode yang akan kita buat di bawah ini:

public class CsvBean { }

Contoh kelas anak:

public class NamedColumnBean extends CsvBean { @CsvBindByName(column = "name") private String name; @CsvBindByName private int age; // getters and setters }

Mari abstrak Daftar yang dikembalikan secara sinkron menggunakan CsvToBean :

 public List beanBuilderExample(Path path, Class clazz) throws Exception { CsvTransfer csvTransfer = new CsvTransfer(); ColumnPositionMappingStrategy ms = new ColumnPositionMappingStrategy(); ms.setType(clazz); Reader reader = Files.newBufferedReader(path); CsvToBean cb = new CsvToBeanBuilder(reader) .withType(clazz) .withMappingStrategy(ms) .build(); csvTransfer.setCsvList(cb.parse()); reader.close(); return csvTransfer.getCsvList(); }

We pass in our bean (clazz) and set that as the ColumnPositionMappingStrategy. In doing so, we associate the fields of our beans with the respective columns of our .csv rows.

We can call that here using the SimplePositionBean subclass of the CsvBean we wrote above:

public String simplePositionBeanExample() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()); return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString(); }

or here using the NamedColumnBean – another subclass of the CsvBean:

public String namedColumnBeanExample() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/namedColumn.csv").toURI()); return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString(); }

3.4. Bean-Based Writing

Lastly, let's take a look at how to use the StatefulBeanToCsv class to write to a .csv file:

public String writeCsvFromBean(Path path) throws Exception { Writer writer = new FileWriter(path.toString()); StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer) .withSeparator(CSVWriter.DEFAULT_SEPARATOR) .build(); List list = new ArrayList(); list.add(new WriteExampleBean("Test1", "sfdsf", "fdfd")); list.add(new WriteExampleBean("Test2", "ipso", "facto")); sbc.write(list); writer.close(); return Helpers.readFile(path); }

Here, we are specifying how we will delimit our data which is supplied as a List of specified CsvBean objects.

Kami kemudian dapat memanggil metode kami writeCsvFromBean () setelah meneruskan jalur file output yang diinginkan:

public String writeCsvFromBeanExample() { Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenBean.csv").toURI()); return BeanExamples.writeCsvFromBean(path); }

4. Kesimpulan

Itu dia - contoh kode sinkron untuk OpenCSV menggunakan kacang, CSVReader , dan CSVWriter . Lihat dokumen resminya di sini.

Seperti biasa, contoh kode disediakan di GitHub.