OpenCSV CSVReader CSVWriter示例
OpenCSV是轻量级的Java CSV解析器。
今天,我们将研究用于CSV解析的OpenCSV示例。
OpenCSV
OpenCSV提供了CSV解析的大多数基本功能。
OpenCSV之所以受欢迎,是因为Java中没有内置的CSV解析器。
OpenCSV CSV解析器中的一些重要类是:
CSVReader:这是OpenCSV中最重要的类。
CSVReader类用于解析CSV文件。
我们可以逐行解析CSV数据或者一次读取所有数据。CSVWriter:CSVWriter类用于将CSV数据写入Writer实现。
您可以定义自定义定界符以及引号。CsvToBean
:当您想将CSV数据转换为Java对象时使用CsvToBean。BeanToCsv
:BeanToCsv用于将Java bean导出到CSV文件。
OpenCSV Maven依赖关系
您可以使用以下maven依赖项添加OpenCSV jar。
<dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>3.8</version> </dependency>
在开始查看示例程序之前,我们需要演示CSV数据和相应的Java bean。
这是我们的示例CSV文件emps.csv
1,hyman Kumar,20,San Franceco 2,David Dan,40,USA 3,Lisa Ray,28,Germany
下面是用于保存CSV数据的java bean类。
package com.theitroad.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编写的常见示例。
CSV阅读器
我们的第一个CSVReader示例是一个接一个地读取CSV文件行,然后转换为Employee列表。
package com.theitroad.csv.opencsv.parser; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.theitroad.csv.model.Employee; import com.opencsv.CSVReader; /** * OpenCSV CSVReader Example, Read line by line * * @author hyman * */ 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.theitroad.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.theitroad.csv.model.Employee; import com.opencsv.CSVReader; /** * OpenCSV CSVReader Example, Read all at once * * @author hyman * */ 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(); } }
CsvToBean
我们希望大多数时间将CSV转换为java对象。
在这些情况下,我们可以使用CsvToBean。
下面是一个简单的示例,显示了如何将我们的员工CSV文件转换为Employee对象列表。
package com.theitroad.csv.opencsv.parser; import java.io.FileReader; import java.io.IOException; import java.util.List; import com.theitroad.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,hyman Kumar,20,San Franceco 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 Writer。
我们将重用上面定义的parseCSVWithHeader()
。
package com.theitroad.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.theitroad.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::hyman Kumar::20::San Franceco}, {2::David Dan::40::USA}, {3::Lisa Ray::28::Germany}] 'ID'#'Name'#'Age'#'Country' '1'#'hyman Kumar'#'20'#'San Franceco' '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
:用于基于时间的转换。