1. Pengenalan
Artikel ringkas ini memperkenalkan OpenCSV 4, perpustakaan yang hebat untuk menulis, membaca, bersiri, deserialisasi, dan / atau menguraikan fail .csv ! Di bawah ini, kami akan melalui beberapa contoh yang menunjukkan cara menyediakan dan menggunakan OpenCSV 4 untuk usaha anda.
2. Persediaan
Inilah cara menambahkan OpenCSV ke projek anda melalui pergantungan pom.xml :
com.opencsv opencsv 4.1
The .jars untuk OpenCSV boleh didapati di laman web rasmi atau melalui carian pantas lebih di Maven Repository.
Fail .csv kami akan sangat mudah, kami akan menyimpannya ke dua lajur dan empat baris:
colA, ColB A, B C, D G, G G, F
3. Untuk Kacang atau Tidak Kacang
Selepas menambah OpenCSV untuk anda pom.xml , kita boleh melaksanakan kaedah dalam dua cara yang mudah CSV pengendalian:
- menggunakan objek CSVReader dan CSVWriter yang berguna (untuk operasi yang lebih mudah) atau
- menggunakan CsvToBean untuk menukar fail .csv menjadi kacang (yang diimplementasikan sebagai objek java-polos-tua ).
Kami akan mengikuti contoh segerak (atau menyekat ) untuk artikel ini supaya kami dapat memberi tumpuan kepada asas-asasnya.
Ingat, kaedah segerak akan menghalang kod sekitar atau seterusnya daripada dilaksanakan sehingga selesai. Mana-mana persekitaran pengeluaran kemungkinan akan menggunakan kaedah tak segerak atau ( tidak menyekat ) yang akan membolehkan proses atau kaedah lain selesai semasa kaedah asinkron selesai.
Kami akan menyelami contoh tak segerak untuk OpenCSV dalam artikel akan datang.
3.1. The CSVReader
CSVReader - melalui kaedah readAll () dan readNext () yang disediakan! Mari lihat bagaimana menggunakan readAll () secara serentak:
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 boleh memanggil kaedah itu dengan memasukkan BufferedReader :
public String readAllExample() throws Exception { Reader reader = Files.newBufferedReader(Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())); return CsvReaderExamples.readAll(reader).toString(); }
Begitu juga, kita boleh abstrak readNext () yang membaca baris demi baris .csv yang dibekalkan :
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 boleh memanggil kaedah itu di sini dengan menyampaikan BufferReader:
public String oneByOneExample() throws Exception { Reader reader = Files.newBufferedReader(Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())); return CsvReaderExamples.oneByOne(reader).toString(); }
Untuk pilihan fleksibiliti dan konfigurasi yang lebih besar, anda boleh menggunakan CSVReaderBuilder sebagai alternatif :
CSVParser parser = new CSVParserBuilder() .withSeparator(',') .withIgnoreQuotations(true) .build(); CSVReader csvReader = new CSVReaderBuilder(reader) .withSkipLines(0) .withCSVParser(parser) .build();
CSVReaderBuilder membolehkan seseorang melangkau tajuk lajur dan menetapkan peraturan parsing melalui CSVParserBuilder .
Dengan menggunakan CSVParserBuilder , kita dapat memilih pemisah lajur tersuai, mengabaikan atau menangani tanda petikan, menyatakan bagaimana kita akan menangani bidang kosong, dan cara menafsirkan watak yang melarikan diri. Untuk maklumat lebih lanjut mengenai tetapan konfigurasi ini, sila rujuk dokumen spesifikasi rasmi.
Seperti biasa, ingatlah untuk menutup semua Pembaca anda untuk mengelakkan kebocoran memori!
3.2. The CSVWriter
CSVWriter juga menyediakan kemampuan untuk menulis ke fail .csv sekaligus atau baris demi baris.
Mari lihat bagaimana menulis ke baris .csv 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 kita tentukan di mana kita mahu menyimpan fail itu dan memanggil kaedah 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 boleh menulis kami .csv semua sekaligus dengan lulus dalam Senarai daripada String tatasusunan mewakili barisan 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 memanggilnya:
public String csvWriterAll() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenAll.csv").toURI()); return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path); }
Itu sahaja!
3.3. Bacaan Berasaskan Kacang
OpenCSV dapat menyusun fail .csv ke dalam skema yang telah ditetapkan dan boleh digunakan semula yang dilaksanakan sebagai kacang pojo Java yang dianotasi . CsvToBean dibina menggunakan CsvToBeanBuilder . Mulai OpenCSV 4, CsvToBeanBuilder adalah cara yang disyorkan untuk bekerjasama dengan com.opencsv.bean.CsvToBean.
Inilah kacang ringkas yang boleh kita gunakan untuk membuat siri .csv dua lajur kita dari bahagian 2 .:
public class SimplePositionBean { @CsvBindByPosition(position = 0) private String exampleColOne; @CsvBindByPosition(position = 1) private String exampleColTwo; // getters and setters }
Setiap lajur dalam fail .csv dikaitkan dengan medan dalam kacang. Pemetaan antara tajuk lajur .csv dapat dilakukan dengan menggunakan anotasi @CsvBindByPosition atau @CsvBindByName yang masing-masing menentukan pemetaan berdasarkan kedudukan atau tajuk rentetan.
Pertama, mari buat superclass yang disebut CsvBean - ini membolehkan kita menggunakan semula dan menggeneralisasikan kaedah yang akan kita bina di bawah:
public class CsvBean { }
Kelas kanak-kanak contoh:
public class NamedColumnBean extends CsvBean { @CsvBindByName(column = "name") private String name; @CsvBindByName private int age; // getters and setters }
Mari abstrak Senarai yang dikembalikan secara serentak 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 boleh memanggil kaedah kami writeCsvFromBean () setelah melewati jalur fail output yang diinginkan:
public String writeCsvFromBeanExample() { Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenBean.csv").toURI()); return BeanExamples.writeCsvFromBean(path); }
4. Kesimpulan
Di sana kita pergi - contoh kod segerak untuk OpenCSV menggunakan kacang, CSVReader , dan CSVWriter . Lihat dokumen rasmi di sini.
Seperti biasa, contoh kod disediakan di GitHub.