分割千万级 csv

依赖

  <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.9.0</version>
  </dependency>
package org.example;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class CSVUtil {

    //测试类
    public static void main(String[] args) throws Exception {
        String path = "D:\\CSVDir\\202301-202305.csv";
        new CSVUtil().splitBigFile(path, "utf-8", ",");
    }
    public List<String> index;
    /**
     * 按数据条数分割文件,
     * @param path
     * @param ENCODE
     * @param splitStr
     * @return
     * @throws Exception
     */
    public void splitBigFile(String path, String ENCODE, String splitStr) throws Exception {
        List<List<String>> outArr = new ArrayList<>();
        File filePath = new File(path);
        String destName = filePath.getName().replace(".csv", "");// 重写文件名
        String destpath = filePath.getParent();// 重写文件路径
        int splitLen = 1000000;// 分割子文件的条数,一个文件10w条
        int i = 0;
        // 数据文件不为空
        if (filePath.exists() && filePath.length() > 0) {
            LineIterator it = FileUtils.lineIterator(filePath, ENCODE);
            while (it.hasNext()) {
                String dataLine = it.nextLine();
                if (dataLine.length() != 0) {
                    String[] arr = dataLine.split(splitStr, -1);
                    List<String> out = new ArrayList<>();
                    for (String str : arr) {
                        out.add(str.replace("^", "")); // 清除特殊字符
                    }
                    if (i == 0 && outArr.size() == 1){
                        index = outArr.get(0);
                    }
                    if (i > 0 && outArr.size() == 0){
                        outArr.add(index);
                    }
                    String newName =
                            new File(destpath + File.separator + destName + "_" + i + ".csv")
                                    .getAbsolutePath();
                    reWriteFile(newName, replaceContent(out).toString(), ENCODE);// 重写文件
                    outArr.add(out);
                    if (outArr.size() == splitLen) {
                        outArr.clear();// 重写完清空文件
                        i++;
                    }
                }
            }
            LineIterator.closeQuietly(it);
        }
    }


    private static StringBuffer replaceContent(List<String> outArr) {
        StringBuffer strbuf = new StringBuffer();
        for (String txt : outArr) {
            // 如果是属于这类数据 无效 置空 华为新数据会有这种情况
            if ("--".equals(txt)) {
                txt = "";
            }
            strbuf.append(txt).append(",");//注意:行分割字符
        }
        return strbuf.append("\n");
    }


    /**
     * 重新写入文件
     * @param fileName
     * @param content
     * @param ENCODE
     */
    public static void reWriteFile(String fileName, String content, String ENCODE) {
        try {
            File ff = new File(fileName);
            if (!ff.exists()) {
                ff.createNewFile();
            }
            // 打开一个随机访问文件流,按读写方式
            RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
            // 文件长度,字节数
            long fileLength = randomFile.length();
            // 将写文件指针移到文件尾。
            randomFile.seek(fileLength);
            String toCn = null;
            // 处理中文问题
            toCn = new String(content.getBytes(ENCODE), "ISO-8859-1");
            randomFile.writeBytes(toCn);
            randomFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中处理千万级数据导出CSV可以使用以下步骤: 1. 读取数据:首先,需要从数据源(例如数据库)获取千万级数据。可以使用Java数据库连接技术(如JDBC)来连接到数据库,然后执行查询语句获取数据。如果数据存储在其他形式的文件中,比如文本文件,可以使用Java文件读取类(如BufferedReader)来读取数据。 2. 创建CSV文件:接下来,需要创建一个CSV文件,以便将数据导出到其中。可以使用Java文件操作类(如FileWriter)来创建和写入CSV文件。 3. 数据转换和写入CSV:对于每个数据条目,需要将其转换为CSV格式并写入到CSV文件中。通常,CSV文件中的每行代表一个数据记录,每个字段由逗号分隔。可以使用Java的字符串处理和分割方法来将数据转换为CSV格式。 4. 分批处理:由于要处理的数据量很大,可能会导致内存问题。为了解决这个问题,可以将数据分较小的批次进行处理,然后将每个批次写入CSV文件。可以使用Java的集合框架(如List)来存储每个批次的数据。 5. 错误处理:在处理大量数据时,可能会遇到各种错误,如数据库连接错误、数据格式错误等。为了确保导出过程的稳定性和可靠性,需要在代码中添加适当的错误处理机制,如异常捕获和日志记录。 6. 导出完:最后,当所有数据都功导出到CSV文件后,需要关闭文件和数据库连接以释放资源。 总而言之,使用Java处理千万级数据导出CSV需要读取数据、创建CSV文件、数据转换和写入、分批处理、错误处理和导出完等步骤。在处理大量数据时,需要注意内存控制和错误处理,以确保导出过程的功。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值