Java解析csv文件
个人博客
使用opencsv解析csv文件并进行ORM映射为对象集合,可以指定分隔符,主要有以下几种映射方式。
接口 | 策略 |
---|---|
MappingStrategy | 顶级接口 |
HeaderColumnNameMappingStrategy | 基于DTO属性名或注解与csv头进行映射 |
ColumnPositionMappingStrategy | 基于DTO属性数组顺序或注解指定顺序进行映射 |
HeaderColumnNameTranslateMappingStrategy | 基于csv头和DTO属性的map关系进行映射 |
1、Maven导包
1 | <dependency> |
2、HeaderColumnNameMappingStrategy
1 | id,short_name,name,remark,parent_id,type_name,type_id |
1 |
|
1 |
|
- 默认基于DTO类的属性名和csv文件第一行的header进行映射。
- 也可以通过
@CsvBindByName
注解指定映射字段名。
3、ColumnPositionMappingStrategy
1 | 1,,大型汽车号牌,1.00,,号牌种类,1 |
3.1、基于@CsvBindByPosition注解方式的DTO
1 |
|
1 |
|
3.2、自定义头数组(DTO不需要注解)
1 |
|
1 |
|
- 基于
@CsvBindByPosition
注解指定字段位置来进行映射。 - 也可以通过自定义头数组与csv文件内容按顺序进行映射。
- csv文件中不需要有文件头,如果有则需要手动跳过。
4、HeaderColumnNameTranslateMappingStrategy
1 | id,short_name,name,remark,parent_id,type_name,type_id |
1 |
|
1 |
|
5、字段类型转换和必输项校验
下面演示将字符串转为BigDecimal
类型,如果解析时id字段为空则抛异常。
1 | id,short_name,name,remark,parent_id,type_name,type_id |
1 |
|
1 | public class ConvertToBigDecimal extends AbstractBeanField { |
1 |
|
- 默认的解析规则只能支持DTO中定义简单类型字段,其它类型可以在注解中指定转换的实现类。
- 指定转换类型的注解主要有
@CsvCustomBindByName
和@CsvCustomBindByPosition
这2种,分别对应基于字段名的映射和基于字段位置的映射。 - 同时可以在注解中指定必输项,如果解析时为空则抛出异常。
6、自定义解析
- 解析时跳过首部指定行数。
- 指定分隔符。
- 跳过特定的行不进行解析。
- 指定必输项校验不通过抛出异常或是忽略不进行解析。
1 | =======================跳过此行======================= |
1 |
|
1 |
|
跳过特定行
1 | public class SkipLineFilter implements CsvToBeanFilter { |
参考链接
代码地址
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 赵晓斌技术博客!
评论