CSV全称“Comma-Separated Values”,是一种逗号分隔值格式的文件,常用来存储数据的纯文本格式文件。本文将用Java语言实现CSV转对象,需要的可以参考一下
介绍:
CSV全称“Comma-Separated Values”,是一种逗号分隔值格式的文件,是一种用来存储数据的纯文本格式文件。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串。
我找了找目前百度上基本是没有这方面的快捷转换方式和工具包,能找到的基本都不能通用写死的,没办法只能自己写一份出来,主要用到的技术,反射,泛型,类型转换,构造者设计模式 ,以下代码给提供一个思路。
参考代码:
package com.application.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
/**
* @description: JAVA 读取.CSV文件内容并转换成对应的List对象工具类
* @author: manhengwei1
* @create: 2023-02-06 09:58
**/
public class ReadCsvUtils {
/**
* 读取csv文件用list对象存储的公共调用方法
*
* @param clazz csv文件对应Java.class
* @param filePath csv文件存储路径
* @param delimiter csv文件对应分隔符","或"|"
* @return 返回List<Object>对象
*/
public static <T> List<T> readCsv(Class<T> clazz, String filePath, String delimiter) {
// 保存读取到的CSV数据
List<T> list = new ArrayList<>();
BufferedReader bufferedReader = null;
try {
// 读取CSV文件 解决中文乱码 GBK或UTF-8
bufferedReader = new BufferedReader(new InputStreamReader(Files.newInputStream(new File(filePath).toPath()), Charset.forName("UTF-8")));
// 循环读取每行
String line;
while ((line = bufferedReader.readLine()) != null) {
// 去除""
line = line.replaceAll("\"", "");
// 分隔字符串(这里用到转义),CSV大部分都是,或者|来分隔数据的,这里看情况来作决定,存储到List<Object>里
// String[] values = line.split("\\,", -1);
String[] values = line.split(delimiter, -1);
// 通过反射获取运行时类
T object = clazz.newInstance();
// 得到类中的所有属性集合
Field[] fields = object.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
// 设置这些属性值是可以访问的
field.setAccessible(true);
// 得到此属性的类型
Class<?> fieldType = field.getType();
if (fieldType == String.class) {
field.set(object, values[i]);
} else if (fieldType == Integer.class) {
field.setInt(object, Integer.parseInt(values[i]));
} else if (fieldType == Double.class) {
field.setDouble(object, Double.parseDouble(values[i]));
} else if (fieldType == Boolean.class) {
field.setBoolean(object, Boolean.parseBoolean(values[i]));
}
}
list.add(object);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 去除head头部
if (list.size() > 0) {
list.remove(0);
}
return list;
}
}
调用方式:
public static void main(String[] args) {
List<Person> personList = ReadCsvUtils.readCsv(Person.class, "C:\\Users\\ext.manhengwei1\\Desktop\\test.csv", ",");
System.out.println(JSON.toJSONString(personList));
}