Автор оригинала: Pankaj Kumar.
Мотивация SuperCSV заключается в том, чтобы быть передовым, быстрым и наиболее удобным для программиста бесплатным CSV-пакетом для Java. К сожалению, у нас нет встроенного анализатора CSV на java.
Суперсв
В java существует множество анализаторов CSV с открытым исходным кодом. Но супер CSVparser-мой любимый. Мощь супер CSV-анализатора заключается в Сотовом процессоре
, который предоставляет множество функций. Вы можете указать значение столбца, которое не должно быть Нулевым, Необязательным, Уникальным. Процессоры ячеек SuperCSV также поддерживают преобразование даты и времени, время Joda, перечисление и т.д.
Сегодня мы рассмотрим пример SuperCSV для чтения CSV-файла и преобразования его в список объектов java. Мы также быстро рассмотрим пример программы Super CSV для записи данных CSV.
Прежде чем мы рассмотрим пример, мы должны создать образец данных CSV и соответствующий компонент java.
1,Pankaj Kumar,20,India 2,David Dan,40,USA 3,Lisa Ray,28,Germany
Наш соответствующий класс javabean-это Сотрудник.java
, как определено ниже.
package com.journaldev.csv.model; public class Employee { private String id; private String name; private String age; private String country; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } @Override public String toString() { return "{" + id + "::" + name + "::" + age + "::" + country + "}"; } }
Суперзвезда Maven
Добавьте нижеприведенную зависимость в свой проект maven pom.xml файл для получения супер CSV-файла.
net.sf.supercsv super-csv 2.4.0
SuperCSV CsvBeanReader
Вот простой пример программы SuperCSV, использующей CsvBeanReader
для анализа списка данных CSV объекта java.
package com.journaldev.csv.supercsv.parser; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.supercsv.cellprocessor.Optional; import org.supercsv.cellprocessor.constraint.NotNull; import org.supercsv.cellprocessor.constraint.UniqueHashCode; import org.supercsv.cellprocessor.ift.CellProcessor; import org.supercsv.io.CsvBeanReader; import org.supercsv.io.ICsvBeanReader; import org.supercsv.prefs.CsvPreference; import com.journaldev.csv.model.Employee; public class SuperCSVParserExample { public static void main(String[] args) throws IOException { Listemps = new ArrayList (); ICsvBeanReader beanReader = new CsvBeanReader(new FileReader("emps.csv"), CsvPreference.STANDARD_PREFERENCE); // the name mapping provide the basis for bean setters final String[] nameMapping = new String[] { "id", "name", "age", "country" }; //to read and skip header row //final String[] header = beanReader.getHeader(true); final CellProcessor[] processors = getProcessors(); Employee emp; while ((emp = beanReader.read(Employee.class, nameMapping, processors)) != null) { emps.add(emp); } System.out.println(emps); beanReader.close(); } private static CellProcessor[] getProcessors() { final CellProcessor[] processors = new CellProcessor[] { new UniqueHashCode(), // ID new NotNull(), // Name new Optional(), // Age new NotNull() // Country }; return processors; } }
Программа проста для понимания, наиболее важной частью является создание супер-процессоров CSV-ячеек.
Если ваш CSV-файл содержит строку заголовка, используйте beanReader.getHeader(true)
для чтения и пропуска заголовка для обработки.
SuperCSV CsvBeanWriter
Простой пример Супер CSV с использованием CsvBeanWriter
для записи данных CSV. Я предполагаю, что поля возраста и страны являются необязательными.
package com.journaldev.csv.supercsv.parser; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.supercsv.cellprocessor.Optional; import org.supercsv.cellprocessor.constraint.NotNull; import org.supercsv.cellprocessor.constraint.UniqueHashCode; import org.supercsv.cellprocessor.ift.CellProcessor; import org.supercsv.io.CsvBeanWriter; import org.supercsv.io.ICsvBeanWriter; import org.supercsv.prefs.CsvPreference; import com.journaldev.csv.model.Employee; public class SuperCSVWriterExample { public static void main(String[] args) throws IOException { Listemps = generateDemoData(); StringWriter writer = new StringWriter(); ICsvBeanWriter beanWriter = new CsvBeanWriter(writer, CsvPreference.STANDARD_PREFERENCE); final String[] header = new String[] { "id", "name", "age", "country" }; final CellProcessor[] processors = getProcessors(); // write the header beanWriter.writeHeader(header); // write the beans data for (Employee emp : emps) { beanWriter.write(emp, header, processors); } beanWriter.close(); System.out.println("CSV Data\n" + writer.toString()); } private static CellProcessor[] getProcessors() { final CellProcessor[] processors = new CellProcessor[] { new UniqueHashCode(), // ID new NotNull(), // Name new Optional(), // Age new Optional() // Country }; return processors; } private static List generateDemoData() { List emps = new ArrayList<>(); Employee emp = new Employee(); emp.setId("1"); emp.setName("Pankaj Kumar"); emp.setAge("30"); // country is optional and not set Employee emp1 = new Employee(); emp1.setId("2"); emp1.setName("David"); emp1.setCountry("USA"); // age is optional Employee emp2 = new Employee(); emp2.setId("3"); emp2.setName("Lisa"); emp2.setAge("20"); emp2.setCountry("India"); emps.add(emp); emps.add(emp1); emps.add(emp2); return emps; } }
Вышеуказанная программа производит вывод ниже CSV.
CSV Data id,name,age,country 1,Pankaj Kumar,30, 2,David,,USA 3,Lisa,20,India
Если вам не нужна строка заголовка, то прокомментируйте код beanWriter.напишите заголовок(заголовок)
в приведенной выше программе.
Если вышеуказанная программа будет изменена, чтобы сохранить идентификатор двух объектов сотрудника одинаковым, то мы получим приведенное ниже исключение.
Exception in thread "main" org.supercsv.exception.SuperCsvConstraintViolationException: duplicate value '2' encountered with hashcode 50 processor=org.supercsv.cellprocessor.constraint.UniqueHashCode context={lineNo=4, rowNo=4, columnNo=1, rowSource=[2, Lisa, 20, India]} at org.supercsv.cellprocessor.constraint.UniqueHashCode.execute(UniqueHashCode.java:78) at org.supercsv.util.Util.executeCellProcessors(Util.java:93) at org.supercsv.io.CsvBeanWriter.write(CsvBeanWriter.java:136) at com.journaldev.csv.supercsv.parser.SuperCSVWriterExample.main(SuperCSVWriterExample.java:33)
Причина в том, что мы определили столбец идентификатора с ограничением уникального хэш-кода. Это очень уникальная и важная функция, отсутствующая во всех других анализаторах CSV в java.
Это все для быстрого урока по СуперКСВ.
Ссылка: Домашняя страница SuperCSV