Пример OpenCSV CSVReader CSVWriter
OpenCSV — это облегченный парсер Java CSV. Сегодня мы рассмотрим пример OpenCSV для парсинга CSV.
OpenCSV
CSVReader
: это самый важный класс в OpenCSV. Класс CSVReader используется для анализа файлов CSV. Мы можем анализировать данные CSV построчно или читать все данные сразу.CSVWriter
: класс CSVWriter используется для записи данных CSV в реализацию Writer. Вы можете определить собственный разделитель, а также кавычки.CsvToBean
: CsvToBean используется, когда вы хотите преобразовать данные CSV в объекты Java.BeanToCsv
: BeanToCsv используется для экспорта компонентов Java в файл CSV.
Зависимость OpenCSV Maven
Вы можете добавить банку OpenCSV, используя приведенную ниже зависимость maven.
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.8</version>
</dependency>
Прежде чем мы начнем рассматривать пример программы, нам потребуются демонстрационные данные CSV и соответствующий Java-бин. Вот наш образец CSV-файла emps.csv
.
1,Pankaj Kumar,20,India
2,David Dan,40,USA
3,Lisa Ray,28,Germany
Ниже приведен наш класс java bean для хранения данных CSV.
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 + "}";
}
}
Давайте рассмотрим некоторые распространенные примеры разбора CSV и записи CSV.
CSVReader
Наш первый пример CSVReader — чтение строк файла CSV одну за другой, а затем преобразование в список сотрудников.
package com.journaldev.csv.opencsv.parser;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.journaldev.csv.model.Employee;
import com.opencsv.CSVReader;
/**
* OpenCSV CSVReader Example, Read line by line
*
* @author pankaj
*
*/
public class OpenCSVReaderLineByLineExample {
public static void main(String[] args) throws IOException {
CSVReader reader = new CSVReader(new FileReader("emps.csv"), ',');
List<Employee> emps = new ArrayList<Employee>();
// read line by line
String[] record = null;
while ((record = reader.readNext()) != null) {
Employee emp = new Employee();
emp.setId(record[0]);
emp.setName(record[1]);
emp.setAge(record[2]);
emp.setCountry(record[3]);
emps.add(emp);
}
System.out.println(emps);
reader.close();
}
}
Приведенный выше пример CSVReader прост для понимания. Один важный момент — закрыть CSVReader, чтобы избежать утечки памяти. Также мы можем указать символ-разделитель на тот случай, если вы используете что-то другое. Следующий пример CSVReader — чтение всех данных за один раз с использованием метода CSVReader readAll()
.
package com.journaldev.csv.opencsv.parser;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.journaldev.csv.model.Employee;
import com.opencsv.CSVReader;
/**
* OpenCSV CSVReader Example, Read all at once
*
* @author pankaj
*
*/
public class OpenCSVReaderReadAllExample {
public static void main(String[] args) throws IOException {
CSVReader reader = new CSVReader(new FileReader("emps.csv"), ',');
List<Employee> emps = new ArrayList<Employee>();
List<String[]> records = reader.readAll();
Iterator<String[]> iterator = records.iterator();
while (iterator.hasNext()) {
String[] record = iterator.next();
Employee emp = new Employee();
emp.setId(record[0]);
emp.setName(record[1]);
emp.setAge(record[2]);
emp.setCountry(record[3]);
emps.add(emp);
}
System.out.println(emps);
reader.close();
}
}
ксвтобин
В большинстве случаев мы хотим преобразовать CSV в объект Java. В этих случаях мы можем использовать CsvToBean. Ниже приведен простой пример, показывающий, как преобразовать CSV-файл нашего сотрудника в список объектов Employee.
package com.journaldev.csv.opencsv.parser;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import com.journaldev.csv.model.Employee;
import com.opencsv.CSVReader;
import com.opencsv.bean.ColumnPositionMappingStrategy;
import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
public class OpenCSVParseToBeanExample {
public static void main(String[] args) throws IOException {
CSVReader reader = new CSVReader(new FileReader("emps.csv"), ',');
ColumnPositionMappingStrategy<Employee> beanStrategy = new ColumnPositionMappingStrategy<Employee>();
beanStrategy.setType(Employee.class);
beanStrategy.setColumnMapping(new String[] {"id","name","age","country"});
CsvToBean<Employee> csvToBean = new CsvToBean<Employee>();
List<Employee> emps = csvToBean.parse(beanStrategy, reader);
System.out.println(emps);
}
}
ColumnPositionMappingStrategy
используется для сопоставления индекса строки данных CSV с полями объекта Employee. Иногда в нашем CSV-файле также есть данные заголовка, например, у нас может быть emps1.csv
, как показано ниже.
ID,NAME,age, country
1,Pankaj Kumar,20,India
2,David Dan,40,USA
3,Lisa Ray,28,Germany
В этом случае мы можем использовать HeaderColumnNameMappingStrategy
в качестве реализации MappingStrategy. Ниже показан метод, показывающий использование HeaderColumnNameMappingStrategy.
// returning list of Employee for CSVWriter example demo data
public static List<Employee> parseCSVWithHeader() throws IOException {
CSVReader reader = new CSVReader(new FileReader("emps1.csv"), ',');
HeaderColumnNameMappingStrategy<Employee> beanStrategy = new HeaderColumnNameMappingStrategy<Employee>();
beanStrategy.setType(Employee.class);
CsvToBean<Employee> csvToBean = new CsvToBean<Employee>();
List<Employee> emps = csvToBean.parse(beanStrategy, reader);
System.out.println(emps);
reader.close();
return emps;
}
CSVWriter
Давайте посмотрим на пример CSVWriter для записи java-объектов в CSV a Writer. Мы будем повторно использовать parseCSVWithHeader()
, определенный выше.
package com.journaldev.csv.opencsv.parser;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.journaldev.csv.model.Employee;
import com.opencsv.CSVWriter;
public class OpenCSVWriterExample {
public static void main(String[] args) throws IOException {
StringWriter writer = new StringWriter();
//using custom delimiter and quote character
CSVWriter csvWriter = new CSVWriter(writer, '#', '\'');
List<Employee> emps = OpenCSVParseToBeanExample.parseCSVWithHeader();
List<String[]> data = toStringArray(emps);
csvWriter.writeAll(data);
csvWriter.close();
System.out.println(writer);
}
private static List<String[]> toStringArray(List<Employee> emps) {
List<String[]> records = new ArrayList<String[]>();
// adding header record
records.add(new String[] { "ID", "Name", "Age", "Country" });
Iterator<Employee> it = emps.iterator();
while (it.hasNext()) {
Employee emp = it.next();
records.add(new String[] { emp.getId(), emp.getName(), emp.getAge(), emp.getCountry() });
}
return records;
}
}
Обратите внимание на использование пользовательского разделителя при записи данных CSV. Мы также указали символ кавычек для использования с полями в столбцах CSV. Приведенный выше пример CSVWriter выводит следующий вывод.
[{1::Pankaj Kumar::20::India}, {2::David Dan::40::USA}, {3::Lisa Ray::28::Germany}]
'ID'#'Name'#'Age'#'Country'
'1'#'Pankaj Kumar'#'20'#'India'
'2'#'David Dan'#'40'#'USA'
'3'#'Lisa Ray'#'28'#'Germany'
Набор результатов OpenCSV CSVWriter
Иногда мы хотим сбросить данные таблиц нашей базы данных в файлы CSV в качестве резервной копии. Мы можем сделать это легко, используя метод CSVWriter writeAll(ResultSet rs, boolean includeColumnNames)
.
Аннотация OpenCSV
OpenCSV также обеспечивает поддержку на основе аннотаций. Вот некоторые из аннотаций OpenCSV;
CsvBindByName
: для привязки между именем столбца входных данных CSV и полем в bean-компоненте.CsvBindByPosition
: для привязки между номером столбца входных данных CSV и полем в bean-компоненте.CsvDate
: для преобразования по времени.
Однако я не хочу использовать аннотации OpenCSV, потому что тогда мой код будет тесно связан с OpenCSV. Это все для учебного примера OpenCSV. Ссылка: Официальная страница OpenCSV