【Java后端】解析csv文件并轉(zhuǎn)成bean對象

為了批量導(dǎo)入數(shù)據(jù),采用了csv文件存儲數(shù)據(jù),后端寫csv解析工具對數(shù)據(jù)進行讀取和解析并導(dǎo)入數(shù)據(jù)庫。

pom依賴:

<!-- csv文件解析依賴 -->

<dependency>

? ? <groupId>com.opencsv</groupId>

? ? <artifactId>opencsv</artifactId>

? ? <version>4.3.2</version>

</dependency>

1、解析csv文件工具類(通用)

public class CsvUtil {

? ? /**

? ? * 日志對象

? ? */

? ? private static final Logger LOGGER = LoggerFactory.getLogger(CsvUtil.class);

? ? /**

? ? * 解析csv文件并轉(zhuǎn)成bean

? ? * @param file csv文件

? ? * @param clazz 類

? ? * @param <T> 泛型

? ? * @return 泛型bean集合

? ? */

? ? public <T> List<T> getCsvData(MultipartFile file, Class<T> clazz) {

? ? ? ? InputStreamReader in;

? ? ? ? try {

? ? ? ? ? ? in = new InputStreamReader(file.getInputStream(), "gbk");

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? LOGGER.error(Constant.LOG_FOMAT_TYPE_TWO,

? ? ? ? ? ? ? ? ? ? ErrorCode.FILE_LOAD_ERROR.getErrorCode(),

? ? ? ? ? ? ? ? ? ? ErrorCode.FILE_LOAD_ERROR.getMessage(),

? ? ? ? ? ? ? ? ? ? e.getMessage());

? ? ? ? ? ? throw BaseException.of(ErrorCode.FILE_LOAD_ERROR.of());

? ? ? ? }

? ? ? ? HeaderColumnNameMappingStrategy<T> strategy = new HeaderColumnNameMappingStrategy<>();

? ? ? ? strategy.setType(clazz);

? ? ? ? CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(in)

? ? ? ? ? ? ? ? .withSeparator(',')

? ? ? ? ? ? ? ? .withQuoteChar('\'')

? ? ? ? ? ? ? ? .withMappingStrategy(strategy).build();

? ? ? ? return csvToBean.parse();

? ? }

}

3、csv文件對應(yīng)的bean對象DataAndTypeCsv.java

public class DataAndTypeCsv {

? ? /**

? ? * 字典代碼

? ? */

? ? @CsvBindByName(column = "code")

? ? private String code;

? ? /**

? ? * 簡寫

? ? */

? ? @CsvBindByName(column = "short_name")

? ? private String shortName;

? ? /**

? ? * 名稱

? ? */

? ? @CsvBindByName(column = "name", required = true)? //是否可以為null 否

? ? private String name;

? ? /**

? ? * 拼音或英文描述

? ? */

? ? @CsvBindByName(column = "remark")

? ? private String remark;

? ? /**

? ? * 父類型id

? ? */

? ? @CsvBindByName(column = "parent_id")

? ? private Integer parentId;

? ? /**

? ? * 類型名稱

? ? */

? ? @CsvBindByName(column = "type_name", required = true)? //是否可以為null 否

? ? private String typeName;

? ? /**

? ? * 類型id

? ? */

? ? @CsvBindByName(column = "type_id", required = true)? //是否可以為null 否

? ? private Integer typeId;


……

get、set方法

……

bean對象通過注解@CsvBindByName(column = “”, required = true) 映射csv文件的列名,并檢查列數(shù)據(jù)是否為空,若是csv文件中該列存在值為空的情況會報錯。

4、應(yīng)用

controller層定義restful接口:

@Transactional(rollbackFor = BaseException.class)

@PostMapping

public Map<String, String> batchInsert(MultipartFile file) {

? ? CsvUtil csvUtil = new CsvUtil();

? ? // 將csv文件內(nèi)容轉(zhuǎn)成bean

? ? List<DataAndTypeCsv> csvData = csvUtil.getCsvData(file, DataAndTypeCsv.class);

? ? ……

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容