从CSV到数据库(简易)

需求:客户上传CSV文档,要求CSV文档内容查重/插入/更新相关数据。
框架:jdbcTemplate、commons-io、
DB:oracle

相关依赖:
这里本来打算用的2.11.0,无奈正式项目那边用老版本1.3.1,新版本对类型支持和转换好一点。不过无伤大雅。

        <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.3.1</version></dependency>

CSV文档格式:

Xxx Code,Yerial,OP
600001,2024082400305, OP20240818_XDFD
600001,2024082400306, OP20240818_XDFD
600001,2024082400307, OP20240818_XDFD
600001,2024082400308, OP20240818_XDFD
600001,2024082400309, OP20240818_XDFD
600001,2024082400310, OP20240818_XDFD
600001,2024082400311, OP20240818_XDFD
600001,2024082400312, OP20240818_XDFD
600001,2024082400313, OP20240818_XDFD
600001,2024082400314, OP20240818_XDFD
600001,2024082400315, OP20240818_XDFD
600001,2024082400316, OP20240818_XDFD
600001,2024082400317, OP20240818_XDFD
600001,2024082400318, OP20240818_XDFD
600001,2024082400319, OP20240818_XDFD
600001,2024082400320, OP20240818_XDFD
600001,2024082400321, OP20240818_XDFD
600001,2024082400322, OP20240818_XDFD
600001,2024082400323, OP20240818_XDFD
600001,2024082400324, OP20240818_XDFD
600001,2024082400325, OP20240818_XDFD

接口:

MultipartFile接受CSV文件

    @PostMapping("/import")public ResponseEntity<BaseResponse<?>> importCSV(@RequestBody MultipartFile files) {xxxService.importSerial(files);return new ResponseEntity<>(new BaseResponse<>(), HttpStatus.OK);}

前段需要在Request-Body中以form-data的形式上传文档
在这里插入图片描述

CSV解析

简单转成Json

    private String convertCsvToJson(MultipartFile multipartFile) throws IOException {// read csv as listList<String> lines = IOUtils.readLines(multipartFile.getInputStream(), "UTF-8");List<List<String>> data = lines.stream().skip(1) // skip label line.filter(line -> !line.trim().isEmpty()) // filtering empty line.map(line -> Arrays.asList(line.split(","))).collect(Collectors.toList());return objectMapper.writeValueAsString(data);}

转换后是这样的:
注意这是print出来的json对象,本来应该是json字符串。

[["600001","2024082400305","OP20240818_XDFD"],["600001","2024082400306","OP20240818_XDFD"],["600001","2024082400307","OP20240818_XDFD"],["600001","2024082400308","OP20240818_XDFD"],["600001","2024082400309","OP20240818_XDFD"],["600001","2024082400310","OP20240818_XDFD"],["600001","2024082400311","OP20240818_XDFD"],["600001","2024082400312","OP20240818_XDFD"],["600001","2024082400313","OP20240818_XDFD"],["600001","2024082400314","OP20240818_XDFD"],["600001","2024082400315","OP20240818_XDFD"],["600001","2024082400316","OP20240818_XDFD"],["600001","2024082400317","OP20240818_XDFD"],["600001","2024082400318","OP20240818_XDFD"],["600001","2024082400319","OP20240818_XDFD"],["600001","2024082400320","OP20240818_XDFD"],["600001","2024082400321","OP20240818_XDFD"],["600001","2024082400322","OP20240818_XDFD"],["600001","2024082400323","OP20240818_XDFD"],["600001","2024082400324","OP20240818_XDFD"],["600001","2024082400325","OP20240818_XDFD"]
]

以clob参数的形式传到oracle存储过程中处理

    public void import(MultipartFile files) {final int[] status = new int[1];Object result = jdbcTemplate.execute(new ConnectionCallback<Object>() {@Overridepublic Object doInConnection(Connection con) throws SQLException, DataAccessException {CallableStatement cs = con.prepareCall("{call TEST_PACKAGE.pro_add_csv_data(?, ?)}");Clob clob = con.createClob(); // 创建一个Clob对象try {String s = convertCsvToJson(files); // csv 转 json字符串clob.setString(1, s); // 把json字符串封装进clob对象中cs.setClob(1, clob);  // 入参cs.registerOutParameter(2, Types.INTEGER); // 出参cs.execute();status[0] = cs.getInt(2); // 取结果} catch (IOException e) {throw new RuntimeException("Import failed.");}return null;}});}

存储过程

PROCEDURE pro_add_csv_data(v_data_list IN CLOB,v_status OUT NUMBER) 
AS v_code VARCHAR2(10);  v_yerial VARCHAR2(20);v_op VARCHAR2(20);v_cur SYS_REFCURSOR;EXC_EXIST EXCEPTION;v_count NUMBER;v_ref VARCHAR2(30) := TO_CHAR(SYSDATE, 'YYYYMMDDHH24MI');
BEGIN    -- 解析成表OPEN v_cur FOR    SELECT jt.*      FROM (    SELECT j.*    FROM JSON_TABLE(    v_data_list , '$[*]' COLUMNS (code VARCHAR2(10) PATH '$[0]',        yerial VARCHAR2(20) PATH '$[1]',        op VARCHAR2(20) PATH '$[2]'        )              ) j    ) jt;  -- 遍历插入LOOP FETCH v_cur INTO v_code, v_yerial, v_op;  EXIT WHEN v_cur%NOTFOUND;INSERT INTO table_oneVALUES( v_code,v_yerial,v_op);END LOOP;COMMIT;CLOSE v_cur;v_status := 0;
EXCEPTION  WHEN EXC_EXIST THEN ROLLBACK;v_status:=2;WHEN OTHERS THENROLLBACK;v_status:=1;
END pro_add_csv_data;

完美

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人脸识别系统代码--照片识别

1.导包 Tkinter用于创建GUI&#xff0c;PIL用于图像处理&#xff0c;cv2用于OpenCV库&#xff0c;subprocess用于运行其他Python脚本。 import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk from PIL.Image import Resampling import cv2 i…

常见攻击类型整理

文章目录 网络攻击web攻击XSS攻击存储型XSS反射型XSSDOM型XSS CSRF攻击SQL注入攻击文件上传漏洞业务逻辑漏洞越权访问水平越权垂直越权 密码找回验证码漏洞 信息泄露暴力破解远程命令执行&#xff08;RCE&#xff09;xxe注入反序列化文件包含本地文件包含&#xff08;LFI&#…

iperf3带宽压测工具使用

iperf3带宽压测工具使用 安装下载地址&#xff1a;[下载入口](https://iperf.fr/iperf-download.php)测试结果&#xff1a;时长测试&#xff08;压测使用&#xff09;:并行测试反向测试UDP 带宽测试 iPerf3 是用于主动测试 IP 网络上最大可用带宽的工具 安装 下载地址&#x…

大话C语言:第21篇 数组

1 数组概述 数组是若干个相同类型的变量在内存中有序存储的集合。 数组是 C 语言中的一种数据结构&#xff0c;用于存储一组具有相同数据类型的数据。 数组在内存中会开辟一块连续的空间 数组中的每个元素可以通过一个索引&#xff08;下标&#xff09;来访问&#xff0c;索…

【Python Cookbook】S1E08 在两个字典中寻找相同点

目录 问题解决方案讨论 问题 在两个字典中&#xff0c;如果我们想要找到其中相同的地方&#xff0c;比如相同的键、相同的值等。 解决方案 考虑以下两个字典以及其中内容&#xff1a; a {x: 1,y: 2,z: 3 }b {w: 10,x: 11,y: 2 }要找出这两个字典中的相同之处&#xff0c;…

Java学习19-List、set容器

目录 一.List&#xff1a; 1.List基本介绍&#xff1a; 2.List接口方法&#xff1a; 3.List的三种遍历方式&#xff1a; 4.ArrayList&#xff1a; &#xff08;1&#xff09;ArrayLis的基本介绍&#xff1a; &#xff08;2&#xff09;ArrayList底层结构和源码分析&…

考研回顾纪录--科软考研失败并调剂兰州大学软件工程专业复试经历

1.背景 本人工作一年后决定考研&#xff0c;遂于2023年4月底离职。5月到家后开始学习。本科东北大学软件工程专业&#xff0c;绩点3.2/5&#xff0c;按照百分制计算是82分。本科纯属混子&#xff0c;只有一个四级551&#xff0c;一个数学竞赛省二等奖&#xff0c;大创学校立项…

算法刷题笔记 最长连续不重复子序列(C++实现)

文章目录 题目描述解题思路实现代码 题目描述 给定一个长度为n的整数序列&#xff0c;请找出最长的不包含重复的数的连续区间&#xff0c;输出它的长度。 输入格式 第一行包含整数n。第二行包含n个整数&#xff08;均在 0∼10^5范围内&#xff09;&#xff0c;表示整数序列。…

vue打包时报错文件包过大

1.问题&#xff1a;npm run build 之后出现 2. 翻译之后意思就是某块过大 3. 解决办法&#xff1a;在vite.config.ts文件上添加 build: { chunkSizeWarningLimit: 1600, }, 4.最终打包

UnityLeapMotion流程记录

突然接到一个LeapMotion的项目&#xff0c;回想起上次做LeapMotion还是在几年前&#xff0c;但是当时没有去记录&#xff0c;所以这次就相当于是重新走了一遍流程。很苦恼&#xff0c;赶紧记录下来。防止之后忘记。这次的需求还是比较简单的&#xff0c;用手滑动控制图片序列播…

在Visual Studio2022中同一个项目里写作业,有多个cpp文件会报错

为了省事&#xff0c;在同一个项目里写很多个题目&#xff0c;结果只有一个cpp文件时没出错&#xff0c;写了2个cpp文件再想运行时就出错了&#xff1b; 将不相关的cpp文件移出去 在源文件中对其点击右键&#xff0c;找到“从项目中排除”&#xff1b; 结果如图&#xff0c;剩…

【Android】 怎么设置蓝牙等待设备连接和接收数据

项目需求 1.打开蓝牙之后等待别的蓝牙设备进行连接。 2.连接之后等待别的设备发送数据&#xff0c;然后接收数据。 3.跟别的蓝牙设备断开连接值进入到等待状态&#xff0c;等待别的蓝牙设备连接。 解决方式 //非手机终端的UUID public static final UUID SPP_UUID UUID.fro…

深度学习21天 —— 卷积神经网络(CNN):识别验证码( 第12天)

目录 一、前期准备 1.1 标签数字化 1.2 加载数据 1.3 配置数据 二、其他 2.1 损失函数 categorical_crossentropy 2.2 plt.legend(loc ) 2.3 history.history 活动地址&#xff1a;CSDN21天学习挑战赛 学习&#xff1a;深度学习100例-卷积神经网络&#xff08;CNN&…

通过 SFP 接口实现千兆光纤以太网通信2

Tri Mode Ethernet MAC IP 核结构 时钟网络 IP 核内部时钟网络结构如下图所示。其中&#xff0c;tx_mac_aclk 为 AXI-Stream 发送接口的同步时钟&#xff0c; rx_mac_aclk 为 AXI-Stream 接收接口的同步时钟。由于在设计中没有使用 MDIO 接口&#xff0c;所以不存在时钟信号 …

二人订单共享结束制:终身受益的新模式

在当今快速发展的互联网时代&#xff0c;一个创新的商业模式总能引起广泛关注。其中&#xff0c;“二人订单共享结束制”以其独特的魅力&#xff0c;吸引了众多消费者和创业者的目光。这一模式不仅为消费者带来了实惠&#xff0c;更为创业者提供了一个全新的平台。 只需购买一…

Android的刷机模式

高通为例子。不看不知道&#xff0c;一看原来这么多。想以前做博通方案&#xff0c;就是一个web刷机包刷到死。到底是技术进步了还是以前太浅薄&#xff1f;&#xff01;。。。 基本参考这篇&#xff1a;https://www.cnblogs.com/bluestorm/p/18129830 常用的应该就是OTA&…

OpenHarmony及鸿蒙应用的屏幕亮度获取以及设置

目录 一.前置知识 二.具体实现 一.前置知识 对应的OpenHarmony版本:V3.2 查找资料发现V3.2版本的OpenHarmony没有获屏幕亮度的接口,只有设置屏幕亮度的接口,这个就很奇怪,所以我最终的方案是获取屏幕亮度使用老的接口,设置屏幕亮度使用新的接口,这样就完成了这个需求…

C/C++中的 extern 和extern“C“关键字详解(通俗易懂)

前言 1、C/C extern关键字用法 2、extern "C"用法 正文 1、extern关键字 extern其实就是一个声明&#xff0c;明确指出一个语句是声明&#xff0c;比如extern int i ;这是声明变量i&#xff0c;而不是定义i&#xff0c;定义i则是int i&#xff08;声明不开辟内存空…

网络数据库后端框架相关面试题

面试是工作的第一步&#xff0c;面试中面试官所提出的问题千奇百怪&#xff0c;其中关于网络数据库后端框架面试题汇总如下&#xff1a; 1&#xff0c;关系型数据库和非关系型数据库的区别 关系型数据库主要有 MYsql Iracle SQLSever等 相对于非关系型数据库的优势为查询效率…

【C++集群聊天服务器(一)】|Linux平台资源受限下boost库和muduo网络库源码编译安装

本人使用的服务器是2G2核 ubuntu22.04 前置工作 muduo库源码github仓库地址&#xff1a; muduo WIndows和Linux平台的boost源码包下载(zip是Windows版&#xff0c;tar.gz是Linux版&#xff0c;你也可以去boost官网下载最新版本) Boost C Libraries 由于muduo网络库是基于boo…