CSV означает « comma-separated values (значения, разделенные запятыми)». Файлы CSV в основном используются для создания файлов данных, либо для экспорта данных, либо для импорта данных.
CSV означает « comma-separated values (значения, разделенные запятыми)». Файлы CSV в основном используются для создания файлов данных, либо для экспорта данных, либо для импорта данных. Язык Java не предоставляет никакой собственной поддержки для эффективной обработки файлов CSV и без использования сторонних библиотек, вы в конечном итоге создаете свой собственный синтаксический анализатор CSV. Поэтому рекомендуется использовать сторонние инструменты для разбора CSV-файлов.
OpenCSV — это такой инструмент, который является очень простой библиотекой парсеров CSV для Java. OpenCSV поддерживает все основные вещи для работы с csv, которые вам могут понадобиться. И некоторые из них мы рассмотрим в этом уроке.
В этом посте мы рассмотрим наиболее распространенные действия, которые вам могут понадобятся в реальных приложениях.
Если вы работаете над проектом с помощью maven, вы можете включить зависимость maven для OpenCSV в файле pom.xml, как показано ниже:
<dependency>
<groupId>net.sf.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>2.3</version>
</dependency>Также вы можете загрузить jar-файлы из http://sourceforge.net/projects/opencsv/, если вы не используете maven.
Ниже приведен список наиболее используемых классов OpenCSV, которые вы должны изучить:
Как уже упоминалось выше, для чтения CSV-файла необходимо использовать CSVReader. Давайте посмотрим на простой пример для чтения файла CSV.
import java.io.FileReader;
import java.util.Arrays;
import au.com.bytecode.opencsv.CSVReader;
public class ParseCSVLineByLine
{
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception
{
//Build reader instance
//Read data.csv
//Default seperator is comma
//Default quote character is double quote
//Start reading from line number 2 (line numbers start from zero)
CSVReader reader = new CSVReader(new FileReader("data.csv"), ',' , '"' , 1);
//Read CSV line by line and use the string array as you want
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
if (nextLine != null) {
//Verifying the read data here
System.out.println(Arrays.toString(nextLine));
}
}
}
}Вышеприведенный пример читает файл CSV по одной строке и печатает в консоль. Вы можете прочитать весь CSV-файл за один раз, а затем перебрать данные по своему усмотрению. Ниже приведен пример чтения CSV-данных с использованием метода readAll ().
import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;
public class ParseFullCSVExample
{
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception
{
//Build reader instance
CSVReader reader = new CSVReader(new FileReader("data.csv"), ',', '"', 1);
//Read all rows at once
List<String[]> allRows = reader.readAll();
//Read CSV line by line and use the string array as you want
for(String[] row : allRows){
System.out.println(Arrays.toString(row));
}
}
}В приведенном выше примере мы читаем весь CSV-файл, а затем мы перебираем строки по очереди.
Создание CSV-файла так же просто, как и чтение. Создайте экземпляр CSVWriter с соответствующими параметрами конфигурации и начните записывать данные в файл CSV. Давайте посмотрим это на примере.
import java.io.FileWriter;
import au.com.bytecode.opencsv.CSVWriter;
public class WritingCSVFileExample
{
public static void main(String[] args) throws Exception
{
String csv = "data.csv";
CSVWriter writer = new CSVWriter(new FileWriter(csv));
//Create record
String [] record = "4,David,Miller,Australia,30".split(",");
//Write the record to file
writer.writeNext(record);
//close the writer
writer.close();
}
}Вышеприведенный пример создает новый CSV-файл и начинает записывать данные с начала. Но хотелось бы добавлять данные в существующий файл CSV вместо того, чтобы создавать новый файл. Вы можете достичь этой функциональности, передав второй аргумент экземпляру FileWriter.
import java.io.FileWriter;
import au.com.bytecode.opencsv.CSVWriter;
public class AppendToCSVExample
{
public static void main(String[] args) throws Exception
{
String csv = "data.csv";
CSVWriter writer = new CSVWriter(new FileWriter(csv, true));
String [] record = "3,David,Feezor,USA,40".split(",");
writer.writeNext(record);
writer.close();
}
}Пользовательский разделитель может быть указан в конструкторе CSVReader или CSVWriter. Давайте посмотрим на пример. Я изменил разделитель по умолчанию c запятой на точку с запятой.
import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;
public class CustomSeperatorExample
{
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception
{
//Build reader instance
CSVReader reader = new CSVReader(new FileReader("data.csv"), ';', '"', 1);
//Read all rows at once
List<String[]> allRows = reader.readAll();
//Read CSV line by line and use the string array as you want
for(String[] row : allRows){
System.out.println(Arrays.toString(row));
}
}
}OpenCSV также предоставляет функциональные возможности для сопоставления CSV-файла со списком Java bean компонентов. Давайте построим для этого небольшой пример.
data.csv
1,Lokesh,Gupta,India,32
2,David,Miller,England,34Employee.java
public class Employee implements Serializable
{
private static final long serialVersionUID = 1L;
private String id;
private String firstName;
private String lastName;
private String country;
private String age;
public String getId()
{
return id;
}
public void setId(String id)
{
this.id = id;
}
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
public String getCountry()
{
return country;
}
public void setCountry(String country)
{
this.country = country;
}
public String getAge()
{
return age;
}
public void setAge(String age)
{
this.age = age;
}
@Override
public String toString()
{
return "Employee [id=" + id + ", firstName=" + firstName + ",
lastName=" + lastName + ", country=" + country + ", age=" + age + "]";
}
}CSVMappedToJavaBeanExample.java
Ниже пример читает файл data.csv и заполняет экземпляры Employee.java. Затем он проверяет данные, распечатывая их в консоли.
import java.io.FileReader;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy;
import au.com.bytecode.opencsv.bean.CsvToBean;
public class CSVMappedToJavaBeanExample
{
@SuppressWarnings({"rawtypes", "unchecked"})
public static void main(String[] args) throws Exception
{
CsvToBean csv = new CsvToBean();
String csvFilename = "data.csv";
CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
//Set column mapping strategy
List list = csv.parse(setColumMapping(), csvReader);
for (Object object : list) {
Employee employee = (Employee) object;
System.out.println(employee);
}
}
@SuppressWarnings({"rawtypes", "unchecked"})
private static ColumnPositionMappingStrategy setColumMapping()
{
ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
strategy.setType(Employee.class);
String[] columns = new String[] {"id", "firstName", "lastName", "country", "age"};
strategy.setColumnMapping(columns);
return strategy;
}
}Output:
Employee [id=1, firstName=Lokesh, lastName=Gupta, country=India, age=32]
Employee [id=2, firstName=David, lastName=Miller, country=England, age=34]Для экспорта данных непосредственно из таблиц SQL в CSV-файл нам понадобится объект ResultSet. Следующий API может использоваться для записи данных в CSV из ResultSet.
java.sql.ResultSet myResultSet = getResultSetFromSomewhere();
writer.writeAll(myResultSet, includeHeaders); //writer is instance of CSVWriterВ вышеприведенном методе первым аргументом является ResultSet, который вы хотите записать в файл CSV. Второй аргумент — boolean, означающий, хотите ли вы писать столбцы заголовков (имена столбцов таблицы) в файл или нет.
Вот мы и рассмотрели основные действия с CSV-файлом из Java-кода. Всем удачи.