OpenCSV CSVReader CSVWriter 示例

OpenCSV 是一个轻量级的 Java CSV 解析器,今天我们将探讨 CSV 解析的 OpenCSV 示例。

开放

OpenCSV, CSVReader, CSVWriter, OpenCSV Example OpenCSV provides most of the basic features for CSV parsing. OpenCSV is more popular because we don't have any builtin CSV parser in java. Some of the important classes in OpenCSV CSV parser are;

  1. CSVReader:这是OpenCSV中最重要的类别. CSVReader 类用于解析 CSV 文件. 我们可以解析 CSV 数据线路或同时读取所有数据.
  2. CSVWriter: CSVWriter 类用于编写 CSV 数据到 Writer 实现中。 您可以定义自定义分界器以及引文
  3. CsvToBean: CsvToBean 用于将 CSV 数据转换为 java 对象
  4. BeanToCsv: BeanToCsv 用于将 Java 豆出口到 CSV 文件(.

OpenCSV Maven 依赖

您可以使用下面的 maven 依赖性添加 OpenCSV 罐。

1<dependency>
2    <groupId>com.opencsv</groupId>
3    <artifactId>opencsv</artifactId>
4    <version>3.8</version>
5</dependency>

在我们开始查看示例程序之前,我们需要演示 CSV 数据和相应的 java 豆。

11,Pankaj Kumar,20,India
22,David Dan,40,USA
33,Lisa Ray,28,Germany

下面是我们的 java 豆类来存储 CSV 数据。

 1package com.journaldev.csv.model;
 2
 3public class Employee {
 4
 5    private String id;
 6    private String name;
 7    private String age;
 8    private String country;
 9
10    public String getId() {
11    	return id;
12    }
13
14    public void setId(String id) {
15    	this.id = id;
16    }
17
18    public String getName() {
19    	return name;
20    }
21
22    public void setName(String name) {
23    	this.name = name;
24    }
25
26    public String getAge() {
27    	return age;
28    }
29
30    public void setAge(String age) {
31    	this.age = age;
32    }
33
34    public String getCountry() {
35    	return country;
36    }
37
38    public void setCountry(String country) {
39    	this.country = country;
40    }
41
42    @Override
43    public String toString() {
44    	return "{" + id + "::" + name + "::" + age + "::" + country + "}";
45    }
46}

让我们看看一些常见的 CSV 解析和 CSV 写作的例子。

css 读者

我们的第一个 CSVReader 示例是,一个接一个阅读 CSV 文件行,然后将其转换为员工列表。

 1package com.journaldev.csv.opencsv.parser;
 2
 3import java.io.FileReader;
 4import java.io.IOException;
 5import java.util.ArrayList;
 6import java.util.List;
 7
 8import com.journaldev.csv.model.Employee;
 9import com.opencsv.CSVReader;
10
11/**
12 * OpenCSV CSVReader Example, Read line by line
13 * 
14 * @author pankaj
15 *
16 */
17public class OpenCSVReaderLineByLineExample {
18
19    public static void main(String[] args) throws IOException {
20
21    	CSVReader reader = new CSVReader(new FileReader("emps.csv"), ',');
22
23    	List<Employee> emps = new ArrayList<Employee>();
24
25    	// read line by line
26    	String[] record = null;
27
28    	while ((record = reader.readNext()) != null) {
29    		Employee emp = new Employee();
30    		emp.setId(record[0]);
31    		emp.setName(record[1]);
32    		emp.setAge(record[2]);
33    		emp.setCountry(record[3]);
34    		emps.add(emp);
35    	}
36
37    	System.out.println(emps);
38    	
39    	reader.close();
40    }
41
42}

上面的CSVReader示例很容易理解,一个重要点是关闭CSVReader以避免记忆泄露,我们也可以指定分界符号,如果您正在使用其他东西,下一个CSVReader示例是使用CSVReader的readAll()方法在一张照片中阅读所有数据。

 1package com.journaldev.csv.opencsv.parser;
 2
 3import java.io.FileReader;
 4import java.io.IOException;
 5import java.util.ArrayList;
 6import java.util.Iterator;
 7import java.util.List;
 8
 9import com.journaldev.csv.model.Employee;
10import com.opencsv.CSVReader;
11
12/**
13 * OpenCSV CSVReader Example, Read all at once
14 * 
15 * @author pankaj
16 *
17 */
18public class OpenCSVReaderReadAllExample {
19
20    public static void main(String[] args) throws IOException {
21    	CSVReader reader = new CSVReader(new FileReader("emps.csv"), ',');
22
23    	List<Employee> emps = new ArrayList<Employee>();
24
25    	List<String[]> records = reader.readAll();
26
27    	Iterator<String[]> iterator = records.iterator();
28
29    	while (iterator.hasNext()) {
30    		String[] record = iterator.next();
31    		Employee emp = new Employee();
32    		emp.setId(record[0]);
33    		emp.setName(record[1]);
34    		emp.setAge(record[2]);
35    		emp.setCountry(record[3]);
36    		emps.add(emp);
37    	}
38
39    	System.out.println(emps);
40
41    	reader.close();
42
43    }
44
45}

我们希望大多数时候将 CSV 转换为 java 对象. 在这些情况下,我们可以使用 CsvToBean. 下面是一个简单的示例,展示了如何将我们的员工 CSV 文件转换为员工对象列表。

 1package com.journaldev.csv.opencsv.parser;
 2
 3import java.io.FileReader;
 4import java.io.IOException;
 5import java.util.List;
 6
 7import com.journaldev.csv.model.Employee;
 8import com.opencsv.CSVReader;
 9import com.opencsv.bean.ColumnPositionMappingStrategy;
10import com.opencsv.bean.CsvToBean;
11import com.opencsv.bean.HeaderColumnNameMappingStrategy;
12
13public class OpenCSVParseToBeanExample {
14
15    public static void main(String[] args) throws IOException {
16    	
17    	CSVReader reader = new CSVReader(new FileReader("emps.csv"), ',');
18    	
19    	ColumnPositionMappingStrategy<Employee> beanStrategy = new ColumnPositionMappingStrategy<Employee>();
20    	beanStrategy.setType(Employee.class);
21    	beanStrategy.setColumnMapping(new String[] {"id","name","age","country"});
22    	
23    	CsvToBean<Employee> csvToBean = new CsvToBean<Employee>();
24    	
25    	List<Employee> emps = csvToBean.parse(beanStrategy, reader);
26    	
27    	System.out.println(emps);
28    	
29    }
30}

「ColumnPositionMappingStrategy」用于将 CSV 数据行索引映射到 Employee 对象字段中,有时我们的 CSV 文件也包含标题数据,例如我们可以像下面那样具有「emps1.csv」。

1ID,NAME,age, country
21,Pankaj Kumar,20,India
32,David Dan,40,USA
43,Lisa Ray,28,Germany

在这种情况下,我们可以使用HeaderColumnNameMappingStrategy作为MappingStrategy的实现。

 1// returning list of Employee for CSVWriter example demo data
 2public static List<Employee> parseCSVWithHeader() throws IOException {
 3    CSVReader reader = new CSVReader(new FileReader("emps1.csv"), ',');
 4    
 5    HeaderColumnNameMappingStrategy<Employee> beanStrategy = new HeaderColumnNameMappingStrategy<Employee>();
 6    beanStrategy.setType(Employee.class);
 7    
 8    CsvToBean<Employee> csvToBean = new CsvToBean<Employee>();
 9    List<Employee> emps = csvToBean.parse(beanStrategy, reader);
10    
11    System.out.println(emps);
12    reader.close();
13    
14    return emps;
15}

作家

让我们看看 CSVWriter 示例,以便将 java 对象写入 CSV a Writer. 我们将重复使用上面定义的 parseCSVWithHeader()

 1package com.journaldev.csv.opencsv.parser;
 2
 3import java.io.IOException;
 4import java.io.StringWriter;
 5import java.util.ArrayList;
 6import java.util.Iterator;
 7import java.util.List;
 8
 9import com.journaldev.csv.model.Employee;
10import com.opencsv.CSVWriter;
11
12public class OpenCSVWriterExample {
13
14    public static void main(String[] args) throws IOException {
15    	StringWriter writer = new StringWriter();
16    	
17    	//using custom delimiter and quote character
18    	CSVWriter csvWriter = new CSVWriter(writer, '#', '\'');
19
20    	List<Employee> emps = OpenCSVParseToBeanExample.parseCSVWithHeader();
21
22    	List<String[]> data = toStringArray(emps);
23
24    	csvWriter.writeAll(data);
25
26    	csvWriter.close();
27    	
28    	System.out.println(writer);
29
30    }
31
32    private static List<String[]> toStringArray(List<Employee> emps) {
33    	List<String[]> records = new ArrayList<String[]>();
34
35    	// adding header record
36    	records.add(new String[] { "ID", "Name", "Age", "Country" });
37
38    	Iterator<Employee> it = emps.iterator();
39    	while (it.hasNext()) {
40    		Employee emp = it.next();
41    		records.add(new String[] { emp.getId(), emp.getName(), emp.getAge(), emp.getCountry() });
42    	}
43    	return records;
44    }
45
46}

请注意在编写CSV 数据时使用自定义分界器。我们还指定了引用字符用于 CSV 列中的字段。

1[{1::Pankaj Kumar::20::India}, {2::David Dan::40::USA}, {3::Lisa Ray::28::Germany}]
2'ID'#'Name'#'Age'#'Country'
3'1'#'Pankaj Kumar'#'20'#'India'
4'2'#'David Dan'#'40'#'USA'
5'3'#'Lisa Ray'#'28'#'Germany'

OpenCSV CSVWriter 结果集

有时我们想将我们的数据库表数据投放到 CSV 文件中作为备份,我们可以轻松地使用 CSVWriter writeAll(ResultSet rs, boolean includeColumnNames) 方法来做到这一点。

OpenCSV 评论

OpenCSV 还提供基于注释的支持,其中一些 OpenCSV 注释包括:

  • CsvBindByName: 用于将 CSV 输入的列名与中的字段联系起来
  • CsvBindByPosition: 用于将 CSV 输入的列号与中的字段联系起来
  • CsvDate: 用于基于时间的转换

然而,我不想使用 OpenCSV 注释,因为我的代码会与 OpenCSV 紧密相连。

Published At
Categories with 技术
Tagged with
comments powered by Disqus