java 读取csv文件数据并保存到数据

项目需求,读取csv文件并将日志数据保存到数据库中:
首先,建表然后对应的xml、dao、实体类、service和实现类。
上实现代码:

package cn.util.controller;

import cn.util.entity.TlVacuumFurnaceLog;
import cn.util.service.vfService;
import cn.util.service.vfServiceImpl;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.SpringBeanContainer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Controller
public class testC {

    @Autowired
    private vfService vfService; // 对应的保存接口

	/**
	 * 导入csv文件处理
	 */
    @RequestMapping("/test1312")
    public void test1(){
        try {
            //  读取文件 “GBK”解决文件里中文乱码
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\真空炉日志20210407StatusLog.csv"), "GBK"));
            reader.readLine();//第一行信息是标题信息,跳过,如果需要第一行信息,请删除这行代码
            String line ;
			
			// 定义list,方便后面批次新增 TlVacuumFurnaceLog是表实体类
            List<TlVacuumFurnaceLog> result = new ArrayList<>();
            // 循环每行数据
            while ((line = reader.readLine()) != null) {
            // 分割字符串
                String item[] = line.split(",");
                if (item.length >0) {
                // 调用下面的方法,将每列数据赋值到对应的属性中,返回的结果新增到list内
                    result.add(propertiesAssignment(item));
                }
            }
            // 保存到数据库
            insertDB(result);
        } catch(Exception e){
            e.printStackTrace();
        }
    }


	/**
	 * 将行数据中每列数据分别添加到对应的属性中,返回实体类
	 */
    public TlVacuumFurnaceLog propertiesAssignment(String[] item) throws Exception{
    	// 获取目标类class
        Class<TlVacuumFurnaceLog> clazz = TlVacuumFurnaceLog.class;
        // 实例化
        TlVacuumFurnaceLog tlVacuumFurnaceLog = clazz.newInstance();

        // 获取对象全部属性
        Field[] fields = clazz.getDeclaredFields();
        // 循环遍历 当前行数据的列数
        for (int i = 0; i < item.length; i++) {
        	// 获取方法名
            String methodName = "set" + fields[i+1].getName().substring(0,1).toUpperCase() + fields[i+1].getName().substring(1);
            // 获取Method参数
            Method method = clazz.getMethod(methodName, fields[i+1].getType());
            // 判断当前属性是什么类型的,将数据进行类型转换
            if ("Integer".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,Integer.parseInt(item[i]));
            } else if ("BigDecimal".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog, new BigDecimal(item[i]));
            } else if ("Short".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,Short.valueOf(item[i]));
            } else if ("Double".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,Double.valueOf(item[i]));
            } else if ("Byte".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,Byte.valueOf(item[i]));
            } else if ("String".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,item[i]);
            }

        }

        return tlVacuumFurnaceLog;
        }


		/**
		 * 保存数据到数据库
		 */
        public void insertDB(List<TlVacuumFurnaceLog> tlVacuumFurnaceLogs){
           // 批量保存	
           vfService.saveBatch(tlVacuumFurnaceLogs);
        }
    }




csv文件:
在这里插入图片描述
保存的数据:
在这里插入图片描述
需要注意的:

  1. csv读取中文乱码,要加入“GBK”
  2. invoke方法相当于第一个参数(对象)来调用method方法,第二个参数是set方法的值,类型要和setter方法类型一致,否则会报类型不匹配错误
  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值