批量转换编码格式,针对csv和txt文件编码格式。

本文介绍了一个用于解决CSV文件编码问题的工具包。该工具能够处理多种编码格式,并将它们统一转换为所需的编码格式,适用于从不同来源获取的CSV文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于第三方给出的csv编码格式问题导致无法导入指定的库表,网上找了许多转换的插件总是不满意。折腾了大半天想想还是自己改造下吧。该工具包解决了几乎所有的编码问题,若是不足之处请指出。由于文件暂存在String类型里面,要是文件太大的话会报内存溢出的错误可以自行调整下代码。



import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;

public class FileCharsetConverter {  

    public static void main(String[] args) throws Exception { 
        String dirPath ="C:\\Users\\oftoo\\Desktop\\服务默认\\原编码\\xx\\xx";
        File dirFile = new File(dirPath);
        File[] files = dirFile.listFiles();
        if (null == files) {
          System.out.println("路径:" + dirPath + ",该文件夹下没有文件");
        } else {
            for (int i = 0; i < files.length; i++) {
                File file = files[i];
                String destFileName = file.getCanonicalPath();
                File destFile = new File(destFileName);
                if (destFile.exists()) {
                    convert(destFile.getCanonicalPath(),  
                        "UTF-16LE", "GBK", new FilenameFilter() {  
                            @Override  
                            public boolean accept(File dir, String name) {  
                                return name.endsWith("csv");  
                            }  
                        });  
                } else {
                    System.out.println("路径:" + dirPath + ",该文件夹下没有文件");
                }
            }
            System.out.println("编码转换结束");
        }

        /*convert("C:\\Users\\xieyh\\Desktop\\测试编码\\LRL_HairStore_Tmall_Acxiom_Transaction_20170619.csv",  
                "UTF-16LE", "GBK", new FilenameFilter() {  
                    @Override  
                    public boolean accept(File dir, String name) {  
                        return name.endsWith("csv");  
                    }  
                });  */

    }  

    public static String getParentPath(File file) {
        if (null != file && file.exists()) {
            return file.getParent();
        }
        return "";
    }

    /** 
     * 把指定文件或目录转换成指定的编码 
     *  
     * @param fileName 
     *            要转换的文件 
     * @param fromCharsetName 
     *            源文件的编码 
     * @param toCharsetName 
     *            要转换的编码 
     * @throws Exception 
     */  
    public static void convert(String fileName, String fromCharsetName,  
            String toCharsetName) throws Exception {  
        convert(new File(fileName), fromCharsetName, toCharsetName, null);  
    }  

    /** 
     * 把指定文件或目录转换成指定的编码 
     *  
     * @param file 
     *            要转换的文件或目录 
     * @param fromCharsetName 
     *            源文件的编码 
     * @param toCharsetName 
     *            要转换的编码 
     * @throws Exception 
     */  
    public static void convert(File file, String fromCharsetName,  
            String toCharsetName) throws Exception {  
        convert(file, fromCharsetName, toCharsetName, null);  
    }  

    /** 
     * 把指定文件或目录转换成指定的编码 
     *  
     * @param file 
     *            要转换的文件或目录 
     * @param fromCharsetName 
     *            源文件的编码 
     * @param toCharsetName 
     *            要转换的编码 
     * @param filter 
     *            文件名过滤器 
     * @throws Exception 
     */  
    public static void convert(String fileName, String fromCharsetName,  
            String toCharsetName, FilenameFilter filter) throws Exception {  
        convert(new File(fileName), fromCharsetName, toCharsetName, filter);  
    }  

    /** 
     * 把指定文件或目录转换成指定的编码 
     *  
     * @param file 
     *            要转换的文件或目录 
     * @param fromCharsetName 
     *            源文件的编码 
     * @param toCharsetName 
     *            要转换的编码 
     * @param filter 
     *            文件名过滤器 
     * @throws Exception 
     */  
    public static void convert(File file, String fromCharsetName,  
            String toCharsetName, FilenameFilter filter) throws Exception {  
        if (file.isDirectory()) {  
            File[] fileList = null;  
            if (filter == null) {  
                fileList = file.listFiles();  
            } else {  
                fileList = file.listFiles(filter);  
            }  
            for (File f : fileList) {  
                convert(f, fromCharsetName, toCharsetName, filter);  
            }  
        } else {  
            if (filter == null  
                    || filter.accept(file.getParentFile(), file.getName())) {  
                String fileContent = getFileContentFromCharset(file,  
                        fromCharsetName);  
                saveFile2Charset(file, toCharsetName, fileContent);  
            }  
        }  
    }  

    /** 
     * 以指定编码方式读取文件,返回文件内容 
     * 
     * @param file 
     *            要转换的文件 
     * @param fromCharsetName 
     *            源文件的编码 
     * @return 
     * @throws Exception 
     */  
    public static String getFileContentFromCharset(File file,  
            String fromCharsetName) throws Exception {  
        if (!Charset.isSupported(fromCharsetName)) {  
            throw new UnsupportedCharsetException(fromCharsetName);  
        }  
        InputStream inputStream = new FileInputStream(file);  
        InputStreamReader reader = new InputStreamReader(inputStream,  
                fromCharsetName);  
        char[] chs = new char[(int) file.length()];  
        reader.read(chs);  
        String str = new String(chs).trim();  
        reader.close();  
        return str;  
    }  

    /** 
     * 以指定编码方式写文本文件,存在会覆盖 
     *  
     * @param file 
     *            要写入的文件 
     * @param toCharsetName 
     *            要转换的编码 
     * @param content 
     *            文件内容 
     * @throws Exception 
     */  
    public static void saveFile2Charset(File file, String toCharsetName,  
            String content) throws Exception {  
        if (!Charset.isSupported(toCharsetName)) {  
            throw new UnsupportedCharsetException(toCharsetName);  
        }  
        OutputStream outputStream = new FileOutputStream(file);  
        OutputStreamWriter outWrite = new OutputStreamWriter(outputStream,  
                toCharsetName);  
        outWrite.write(content);  
        outWrite.close();  
    }  

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值