OpenCSV是一个流行的Java库,用于处理CSV(逗号分隔值)文件。它提供了将CSV数据映射到Java对象(JavaBean)的功能,这种功能通常称为"数据绑定"或"对象映射"。
OpenCSV提供了两种主要方式将CSV映射到JavaBean:
@CsvBindByName
等注解@CsvBindByPosition
注解HeaderColumnNameTranslateMappingStrategy
或ColumnPositionMappingStrategy
public class Employee {
@CsvBindByName(column = "ID")
private int id;
@CsvBindByName(column = "Name")
private String name;
@CsvBindByName(column = "Age")
private int age;
@CsvBindByName(column = "Salary")
private double salary;
// 必须有无参构造函数
public Employee() {}
// getter和setter方法
// ...
}
try (Reader reader = new FileReader("employees.csv")) {
CsvToBean<Employee> csvToBean = new CsvToBeanBuilder<Employee>(reader)
.withType(Employee.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
List<Employee> employees = csvToBean.parse();
for (Employee emp : employees) {
System.out.println(emp);
}
} catch (IOException e) {
e.printStackTrace();
}
List<Employee> employees = new ArrayList<>();
// 添加Employee对象到列表...
try (Writer writer = new FileWriter("output.csv")) {
StatefulBeanToCsv<Employee> beanToCsv = new StatefulBeanToCsvBuilder<Employee>(writer)
.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
.build();
beanToCsv.write(employees);
} catch (IOException | CsvRequiredFieldEmptyException | CsvDataTypeMismatchException e) {
e.printStackTrace();
}
原因:列名不匹配或字段类型不兼容 解决:
@CsvCustomBindByName(column = "Date", converter = LocalDateConverter.class)
private LocalDate hireDate;
原因:CSV中存在空值而JavaBean字段是基本类型 解决:
@CsvBindByName(column = "Age", required = false)
private Integer age; // 使用Integer而不是int
原因:处理大型CSV文件时内存不足 解决:
CsvToBean<Employee> csvToBean = new CsvToBeanBuilder<Employee>(reader)
.withType(Employee.class)
.withBatchSize(1000) // 分批处理
.build();
原因:CSV中包含引号、逗号等特殊字符 解决:
StatefulBeanToCsv<Employee> beanToCsv = new StatefulBeanToCsvBuilder<Employee>(writer)
.withQuotechar(CSVWriter.DEFAULT_QUOTE_CHARACTER)
.withEscapechar(CSVWriter.DEFAULT_ESCAPE_CHARACTER)
.build();
public class LocalDateConverter extends AbstractBeanField<LocalDate> {
@Override
protected Object convert(String value) {
return LocalDate.parse(value, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
}
}
CSVReader reader = new CSVReaderBuilder(new FileReader("data.tsv"))
.withCSVParser(new CSVParserBuilder().withSeparator('\t').build())
.build();
OpenCSV提供了强大而灵活的CSV处理能力,通过合理配置可以满足大多数CSV处理需求。