JAVA实现CSV文件转List<Object>

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));
    }
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java 8的新特性Stream来实现List<ADto>输出成CSV文件的功能,具体代码如下: ```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Field; import java.util.List; import java.util.stream.Collectors; public class CsvUtils { public static <T> void writeCsv(List<T> dataList, Class<T> clazz, String filePath) throws IOException { List<String> csvLines = dataList.stream() .map(data -> toCsvLine(data, clazz)) .collect(Collectors.toList()); writeLinesToFile(csvLines, filePath); } private static <T> String toCsvLine(T data, Class<T> clazz) { List<String> fieldValues = getFieldValues(data, clazz); return String.join(",", fieldValues); } private static <T> List<String> getFieldValues(T data, Class<T> clazz) { return Stream.of(clazz.getDeclaredFields()) .map(field -> { field.setAccessible(true); try { Object value = field.get(data); return String.valueOf(value); } catch (IllegalAccessException e) { throw new RuntimeException("Failed to get field value", e); } }) .collect(Collectors.toList()); } private static void writeLinesToFile(List<String> lines, String filePath) throws IOException { try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { for (String line : lines) { writer.write(line); writer.newLine(); } } } } ``` 调用示例: ```java List<ADto> dataList = ...; // 假设已经有了数据 String filePath = "data.csv"; CsvUtils.writeCsv(dataList, ADto.class, filePath); ``` 其中,`ADto`是一个自定义的Java类,表示CSV文件中的一行数据。上述代码中,我们通过反射来获取`ADto`对象的所有字段值,并将其转换成一个CSV行。然后使用`BufferedWriter`将所有CSV行写入到文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值