Java处理csv文件编码格式导致中文乱码解决方案

本次开发使用java 处理csv 文件上传到服务器本地,再由服务器本地经过Hdfs 导入Hive 表中,步骤如下:

一、CsvEncodingConverter方法

package com.ys.common.hadoop;

import java.io.*;
import java.nio.charset.StandardCharsets;
import org.mozilla.intl.chardet.nsDetector;
import org.springframework.web.multipart.MultipartFile;

/**
 * CsvEncodingConverter 类用于检测和转换 CSV 文件的编码格式。
 */
public class CsvEncodingConverter {

    /**
     * 检测给定 MultipartFile 中 CSV 文件的编码格式。
     *
     * @param file 要检测的 CSV 文件
     * @return CSV 文件的编码格式,如果无法确定,则返回 null
     * @throws RuntimeException 如果在检测文件编码时发生错误
     */
    public static String findEncoding(MultipartFile file) {
        try {
            return guessFileEncoding(file);
        } catch (IOException e) {
            throw new RuntimeException("Error while detecting file encoding", e);
        }
    }

    /**
     * 通过检测 MultipartFile 中的 CSV 文件来猜测其编码格式。
     *
     * @param file 要检测的 CSV 文件
     * @return CSV 文件的编码格式,如果无法确定,则返回 null
     * @throws IOException 如果在检测文件编码时发生错误
     */
    private static String guessFileEncoding(MultipartFile file) throws IOException {
        try (InputStream inputStream = file.getInputStream()) {
            nsDetector detector = new nsDetector();
            byte[] buf = new byte[1024];
            int len;
            boolean isAscii = false;

            while ((len = inputStream.read(buf, 0, buf.length)) != -1) {
                isAscii = detector.isAscii(buf, len);
                if (isAscii) {
                    return "ASCII";
                }
                detector.DoIt(buf, len, false);
            }

            detector.DataEnd();

            String[] probableCharsets = detector.getProbableCharsets();
            if (probableCharsets.length > 0 && !"nomatch".equals(probableCharsets[0])) {
                return probableCharsets[0];
            } else {
                // 如果无法识别编码,返回默认编码 gb18030
                return "gb18030";
            }
        } catch (IOException e) {
            throw new IOException("检测文件编码时出错", e);
        }
    }

    /**
     * 将给定 MultipartFile 中的 CSV 文件转换为 UTF-8 编码,并保存到指定路径。
     *
     * @param file            要转换的 CSV 文件
     * @param sourceEncoding  原文件的编码格式
     * @param newFilePath     转换后的文件保存路径
     * @throws RuntimeException 如果在转换和保存文件时发生错误
     */
    public static void convertAndSaveToFile(MultipartFile file, String sourceEncoding, String newFilePath) {
        try (InputStream inputStream = file.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, sourceEncoding));
             BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newFilePath), StandardCharsets.UTF_8))) {

            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }

        } catch (IOException e) {
            // 处理不支持的字符集异常,可以选择使用默认字符集或其他支持的字符集
            e.printStackTrace();
        }
    }
}

二、方法调用

// 检测文件编码
String currentEncoding = CsvEncodingConverter.findEncoding(file);
logger.warn("currentEncoding:" + currentEncoding);
// 上传文件到本地服务器
CsvEncodingConverter.convertAndSaveToFile(file, currentEncoding, uploadFilePath);

参考网址:https://blog.csdn.net/qq_33505051/article/details/86736039

先检查csv文件的编码格式,如果获取失败,则默认读取文件编码格式为:gb18030b,再转化为UTF-8 编码格式,关于其他导入到Hive代码,有问题欢迎留言讨论。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 如果你在使用notepad++更改csv文件编码格式时出现中文乱码的问题,可以尝试以下步骤来解决。首先,确保你已经安装了notepad++插件管理器。然后,搜索并安装Python Script插件。重启notepad++后,新建一个脚本,将以下代码复制到脚本中: ```python import os import sys # 需要转换编码格式文件夹路径 dir_to_convert = "E:\\repository\\your-actual-dir-to-convert" for root, dirs, files in os.walk(dir_to_convert): for file in files: if file\[-4:\] == '.csv': # 指定需要转换编码格式文件类型 notepad.open(root + "\\" + file) notepad.runMenuCommand("Encoding", "Convert to UTF-8-BOM") notepad.save() notepad.close() ``` 将`dir_to_convert`替换为你需要转换编码格式文件夹路径。然后运行脚本,它将批量将指定文件夹中的csv文件转换为UTF-8-BOM编码格式,以解决中文乱码问题。\[3\] 请注意,这个方法需要使用Python Script插件,并且需要按照指定的格式来编写脚本。这样可以确保在转换编码格式时不会出现乱码问题。 #### 引用[.reference_title] - *1* [CSV文件乱码问题解决](https://blog.csdn.net/qq_36893938/article/details/115303737)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [批量转换文件编码(By notepad++)](https://blog.csdn.net/uddiqpl/article/details/109593248)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值