Поиск по сайту:

Пример OpenCSV CSVReader CSVWriter


OpenCSV — это облегченный парсер Java CSV. Сегодня мы рассмотрим пример OpenCSV для парсинга CSV.

OpenCSV

  1. CSVReader: это самый важный класс в OpenCSV. Класс CSVReader используется для анализа файлов CSV. Мы можем анализировать данные CSV построчно или читать все данные сразу.
  2. CSVWriter: класс CSVWriter используется для записи данных CSV в реализацию Writer. Вы можете определить собственный разделитель, а также кавычки.
  3. CsvToBean: CsvToBean используется, когда вы хотите преобразовать данные CSV в объекты Java.
  4. 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