Java处理post请求中的csv文件(判断文件编码)_java判断csv编码_0x4c0x43的博客-程序员秘密

技术标签: java  post  csv  乱码  

今天在工作中遇到了一个需求,需要用Java处理post请求中的csv文件,由于之前没处理过,遇到了很多问题,特此记录。
由于具体的业务会有区别,本文主要介绍了处理逻辑的代码,如需要请结合具体业务与注释做出修改即可。

pom坐标

<!--GetByteEncode,用来判断二进制字节流的编码-->
        <dependency>
            <groupId>com.googlecode.juniversalchardet</groupId>
            <artifactId>juniversalchardet</artifactId>
            <version>1.0.3</version>
        </dependency>

Controller

用springboot中的MultipartFile去接收文件,然后转为字节数组调用我们写好的工具类处理,处理结果为List形式,key为我们配置的列名,value为数据,每列数据存入一个map中,可以根据需要自行修改。

@RestController
@RequestMapping("/admin")
public class TestCntroller {
    
    @RequestMapping("/test/upload")
    public void upload(HttpServletRequest request , MultipartFile upfile) throws Exception{
    
        if(request.getMethod().equals("POST")){
    
            byte[] bate = upfile.getBytes();
            List<Map<String,Object>> list = ReadCsvUtil.getResource(bate);
}

csv工具类具体代码

import java.io.*;
import java.util.*;

public class ReadCsvUtil {
    
    private static final String FIX="\uFEFF";
    /**
     * 获取csv文件内容
     * @return 对象list
     */
    public static List<Map<String,Object>> getResource(byte[] bate) throws IOException {
    
        List<Map<String,Object>> allString = new ArrayList();
        Map<String,Object> callLogInfo;
        List<String> list = new ArrayList();
        // 获取文件内容
        list = getSource(bate);
        // 获取文件表头
        List<String> title = Arrays.asList(list.get(0).split(","));
        //此处可用一循环去获取文件表头
        String customerName = title.get(0).trim();

        // 头部会带有"\uFEFF"值
        if(customerName.startsWith(FIX)){
    
            customerName = customerName.replace(FIX, "");
        }
        callLogInfo = new HashMap();
        //此处可用一循环遍历所有列
        callLogInfo.put("列名",customerName);
		//将当前列处理完后加入list中
        allString.add(callLogInfo);
		//去掉表头行
        list.remove(0);
        // 循环内容
        for(int i = 0; i<list.size();i++){
    
            List<String> content = Arrays.asList(list.get(i).split(","));
            if(content!=null){
    
                callLogInfo = new HashMap();
                //此处可根据需要遍历所有列添加
                callLogInfo.put("列名",content.get(0));

                allString.add(callLogInfo);
            }
        }
        return allString;
    }

    /**
     * 读文件数据
     */
    public static List<String> getSource(byte[] bate) throws IOException {
    
        BufferedReader br = null;
        ByteArrayInputStream fis=null;
        InputStreamReader isr = null;
        try {
    
            fis = new ByteArrayInputStream(bate);
            //指定以当前文件编码读取
            isr = new InputStreamReader(fis,GetByteEncode.getEncoding(bate));
            br = new BufferedReader(isr);
        } catch (Exception e) {
    
            e.printStackTrace();
        }
        String line;
        String everyLine ;
        List<String> allString = new ArrayList<>();
        try {
    
            //读取到的内容给line变量
            while ((line = br.readLine()) != null){
    
                everyLine = line;
                allString.add(everyLine);
            }
        } catch (IOException e) {
    
            e.printStackTrace();
        }finally {
    
            if(fis != null){
    
                fis.close();
            }
            if(isr != null){
    
                isr.close();
            }
        }
        return allString;
    }
}

判断二进制字节流编码

由于会遇到很多不同的编码格式的文件,因此需要判断文件编码格式。注意最上方的的pom一定要导入,否则无法使用。

import org.mozilla.universalchardet.UniversalDetector;
/**
 * 获取byte编码
 * @Author LuChuan
 * @Date 2021/7/8 11:28
 */
public class GetByteEncode {
    

    /**
     * 获取文件编码类型
     *
     * @param bytes 文件bytes数组
     * @return      编码类型
     */
    public static String getEncoding(byte[] bytes) {
    
        String defaultEncoding = "UTF-8";
        UniversalDetector detector = new UniversalDetector(null);
        detector.handleData(bytes, 0, bytes.length);
        detector.dataEnd();
        String encoding = detector.getDetectedCharset();
        detector.reset();
        if (encoding == null) {
    
            encoding = defaultEncoding;
        }
        return encoding;
    }
}

前端测试代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/admin/test/upload" method="post" enctype="multipart/form-data">
    上传:<input type="file" name="upfile"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wd_n_m_d_/article/details/118651106

智能推荐

联想DPI专业修复工具,解决win8/10字体显示模糊问题_windows8dpi模糊_青疯的博客-程序员秘密

联想DPI专业修复工具是一款针对广大联想电脑用户打造的dpi修复工具,软件可以帮助用户一键修复win8和win10系统内的dpi,可以有效解决用户电脑启动后字体显示模糊的问题,一键配置dpi放大缩小,让用户可以在屏幕上更便携的更改文本大小和其他项的要求!联想DPI专业修复工具使用说明:1.下载解压,双击联想DPI专业修复工具.exe程序打开工具2.程序启动后,阅读许可协议,点击“同意”...

漫谈初学者机器学习模型设计?_机器学习模型为什么那样设计_Twig程的博客-程序员秘密

首先,我也是一个机器学习初学者,这里跟大家聊一下自己的最近学习感悟。我认为在面对一件事务的时候,首先对这个事务来一个深刻的认识很重要。首先我们来看一下统计学习具体由什么构成或者有什么重要的要素? 这一点我参造《统计学习方法》里面写道,统计机器学习方法是由模型、策略和算法构成的。 方法 = 模型+策略+算法模型Model在监督学习过程中,模型就是要学习的条件概率分布或者决策函数。模型...

nginx 之 proxy_pass 后缀配置_ZPJeck的博客-程序员秘密

安装完成后注意一下四个proxy_pass的配置:访问http://192.168.5.6/test/index.html为例第一个 :ip/ location /test/ { proxy_pass http://127.0.0.1/; } 此时访问的实际路径:http://192.168.5.6/index.html第二个:ip location /test/ ...

uni-app项目中列表上拉加载和下拉刷新逻辑采用mixins封装_uniapp 下拉加载封装_九段刀客的博客-程序员秘密

提取下拉加载,上拉刷新公用逻辑import request from '@/utils/request';export default { data() { return { // 调用request方法传入的参数 baseURL: this.$store.getters.BASE_URL, url: '', method: 'GET', // get请求参数 params: {}, // post请求参数 data: {}, //存放列表数

python :codecs模块简介_happy_wealthy的博客-程序员秘密

python :codecs模块简介python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:原有编码 -&gt; 内部编码 -&gt; 目的编码python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码 位,另一种是UCS-4,它有2147483648g个码

HDU题目分类_hdu中等题目_A_Eagle的博客-程序员秘密

基础题:1000、1001、1004、1005、1008、1012、1013、1014、1017、1019、1021、1028、1029、1032、1037、1040、1048、1056、1058、1061、1070、1076、1089、1090、1091、1092、1093、1094、1095、1096、1097、1098、1106、1108、1157、1163、1164、1170、1194、1

随便推点

Maven报错无法解析插件_普通网友的博客-程序员秘密

某天本人创建好一个Maven项目写导入依赖的时候给我跳出一个错误,说一些Maven插件无法解析(虽说这是个小问题,但这个问题直接卡了一个小时的说 ,具体出错效果可以参考下图)!注意哦!我这是在没网的情况下,有网的话maven会直接给你在中央仓库里下载的,也就不存在我这个问题了好吧,出现这个问题的话一般是两个地方出错了1.首先呢我们是去找Maven安装目录(也就是你下载到Maven文件然后解压到的那个地方)里面的conf文件夹下的settings.xml文件。2.双击进去检查本地仓库的全局配置(还

xmind怎么导出甘特图_教程|如何利用XMind实现高效的项目管理?_weixin_39626586的博客-程序员秘密

小爱思会在知乎的定期为大家发布一些 XMind 的完整教程,tips,等等,希望能为大家带去帮助。直接戳视频教程如今,需要管理的项目变得越来越庞大、越来越复杂。项目经理乔治一个人同时管理着五个主要项目,其中一个项目截止日期只剩下两周了,而项目进度却至少落后了五周。这太艰难了!像乔治这样同时挑战多个项目管理的人,绝不只是个例。对此,项目管理者需要找到更好的工具来帮助自己提高对项目的计划和执行,项目状...

力扣 5778. 使二进制字符串字符交替的最少反转次数 思维 规律_csu_xiji的博客-程序员秘密

https://leetcode-cn.com/problems/minimum-number-of-flips-to-make-the-binary-string-alternating/思路:dpdpdp的做法可以看官方题解……这边说一下我的思路,感觉想的有点歪。首先可以认为原始字符串由若干个交替字符串拼接而成,那么我们先找到这些交替字符串,然后把所有奇数或者所有偶数位置的交替字符串全部翻转,即可把它们全部拼接起来。因此最少操作要么在奇数位置产生,要么在偶数位置产生。但是这样我们只使用了操作2,没有

一个非计算机专业的 软考初级 程序员考试之路_非计算机专业初级程序员_Doria_Lee的博客-程序员秘密

大一一都都在一个社科专业学习,到大一下学期才申请转专业到物联网工程专业,说是计算机相关专业,其实在大一放假之前,也只是考了一个省级的二级C语言。大概在暑假的时候,学校里发了通知 - 说是有一个“软考”当时也不知到它是什么,就百度上找了找资料,结合自己的实际,一暑假闲着也是闲着,不如去考以下。软考分初级,中级,高级,在网上看过高级,中级等考试题后,呵呵一笑,哪门是我等屌丝可以考过的!?结合自...

Zend Studio 调试Zend Debugger和XDebug_xdebug zenddebug_xmlife的博客-程序员秘密

安装Zend Debugger下载到http://downloads.zend.com/pdt/server-debugger下载最新的debugger下载后将zip解压缩。得到一个目录:有x_x_x_comp和x_x_x_nts_comp,x指版本号,用phpinfo查看php版本和thread safe属性,配置1、请将ZendDebugger.dll复制到您的php安