csv工具类

package com.cwp.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class MyCsvUtil {

    /**
     * CSV文件生成方法  字符流追加:FileWriter writer = new FileWriter(file,true)
     *
     * @param headLabel 头部标签
     * @param dataList  数据列表
     * @param csvFile  文件
     * @param addFlag   是否追加
     */
    public static void  writeToCsv(String headLabel, List<String> dataList, File csvFile, boolean addFlag) {

        BufferedWriter buffWriter = null;
        try {

            //文件输出流对象,第二个参数时boolean类型,为true表示文件追加(在已有的文件中追加内容)
          /*  FileWriter writer = new FileWriter(csvFile, addFlag);*/
            buffWriter =  FileUtil.getWriter(csvFile, CharsetUtil.CHARSET_GBK,addFlag);
            //构建缓存字符输出流(不推荐使用OutputStreamWriter)
           /* buffWriter = new BufferedWriter(writer, 1024);*/
            //头部不为空则写入头部,并且换行
            if (StringUtils.isNotBlank(headLabel)) {
                buffWriter.write(headLabel);
                buffWriter.newLine();
            }
            //遍历list
            for (String rowStr : dataList) {
                //如果数据不为空,则写入文件内容,并且换行
                if (StringUtils.isNotBlank(rowStr)) {
                    buffWriter.write(rowStr);
                    buffWriter.newLine();//文件写完最后一个换行不用处理
                }
            }
            //刷新流,也就是把缓存中剩余的内容输出到文件
            buffWriter.flush();
        } catch (Exception e) {
            System.out.println("写入csv出现异常");
            e.printStackTrace();
        } finally {
            try {
                //关闭流
                if (buffWriter != null) {
                    buffWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    /**
     * 根据文件路径读取csv文件的内容
     *
     * @param filePath
     * @return
     */
    public static List<String> readFromCsv(String filePath) {
        ArrayList<String> dataList = new ArrayList<>();
        BufferedReader buffReader = null;
        try {
            //构建文件对象
            File csvFile = new File(filePath);
            //判断文件是否存在
            if (!csvFile.exists()) {
                System.out.println("文件不存在");
                return dataList;
            }
            //构建字符输入流
            buffReader =  FileUtil.getReader(csvFile, CharsetUtil.CHARSET_GBK);
           /* FileReader fileReader = new FileReader(csvFile);*/
            //构建缓存字符输入流
           /* buffReader = new BufferedReader(fileReader);*/
            String line = "";
            //根据合适的换行符来读取一行数据,赋值给line
            while ((line = buffReader.readLine()) != null) {
                if (StringUtils.isNotBlank(line)) {
                    //数据不为空则加入列表
                    dataList.add(line);
                }
            }
        } catch (Exception e) {
            System.out.println("读取csv文件发生异常");
            e.printStackTrace();
        } finally {
            try {
                //关闭流
                if (buffReader != null) {
                    buffReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return dataList;
    }


    private static void appendToCsvExample() {
       String csvfile = "E:\\csv\\对账文件20211111.csv";
       File csvFile=new File(csvfile);
        List<String> dataList = new ArrayList<>();
        dataList.add("190469730006,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:52:57,8");
        dataList.add("190469730173,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:53:54,8");
        dataList.add("190469730367,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:54:50,8");
        dataList.add("190469736543,100011,4000,4000,0,105000041112608,01,00,2021-09-12 17:25:53,8");
        dataList.add("190469746558,100011,4000,4000,0,105000041112608,01,00,2021-09-12 18:14:13,8");
        MyCsvUtil.writeToCsv("", dataList, csvFile, true);
    }


    private static void writeToCsvExample() {
        String headDataStr = "交易流水,商户编号,订单金额,支付金额,优惠金额,收款账户,支付方式,支付状态,支付时间,交易类型";
         String csvfile = "E:\\csv\\对账文件20211111.csv";
        List<String> dataList = new ArrayList<>();
        File csvFile=new File(csvfile);
       /* dataList.add("190469644375,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:44:12,8");
        dataList.add("190469644954,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:50:10,8");
        dataList.add("190469645620,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:56:59,8");
        dataList.add("190469661593,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:51:24,8");
        dataList.add("190469661738,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:52:15,8");
        dataList.add("190469661853,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:52:51,8");
        dataList.add("190469661931,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:53:27,8");
        dataList.add("190469699471,100011,2000,2000,0,105000041112608,03,00,2021-09-12 13:59:02,8");
        dataList.add("190469699540,100011,2000,2000,0,105000041112608,03,00,2021-09-12 13:59:29,8");
        dataList.add("190469712840,100011,4000,4000,0,105000041112608,03,00,2021-09-12 15:20:32,8");*/
        MyCsvUtil.writeToCsv(headDataStr, dataList, csvFile, false);
    }

    private static void readFromCsvExample() {
        String csvFilePath = "E:\\csv\\对账文件20211111.csv";
        List<String> list = MyCsvUtil.readFromCsv(csvFilePath);
        for (String data : list) {
            System.out.println(data);
        }
    }


  public static void main(String[] args) {

      writeToCsvExample();
      appendToCsvExample();
      readFromCsvExample();

  }
}

参考文章:Java实现CSV文件的读写(包含追加内容)_嘉禾嘉宁papa-优快云博客目录一、简介二、maven依赖或jar三、CSV工具类四、CSV读写测试4.1、文件写入4.2、文件内容追加4.3、文件读取结语一、简介  逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据,CSV文件的特点:文件由任意数目的记录组成每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符记录间https://blog.youkuaiyun.com/Alian_1223/article/details/121243848

opencsv项目参考地址:How to read and parse CSV file in Java - Mkyong.comTalks about CSV file parsing, RFC 4180, OpenCSV and Single class implementation examples to read and parse a CSV file.https://mkyong.com/java/how-to-read-and-parse-csv-file-in-java/ 

### Java CSV阅读器工具类示例 为了满足需求,在Java中创建一个专门用于读取CSV文件的工具类是非常有帮助的。下面展示了这样一个工具类的具体实现方式。 #### 定义CSVReaderUtil 类 该类提供了静态方法`readCsvFile`,能够接收文件路径作为参数并返回包含每行数据列表的集合: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class CSVReaderUtil { /** * Reads a CSV file and returns its content as list of lists. * * @param filePath The path to the CSV file that needs reading. * @return A List containing Lists, each inner List represents one line from the CSV file. */ public static List<List<String>> readCsvFile(String filePath) { List<List<String>> records = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; while ((line = br.readLine()) != null) { String[] values = line.split(","); records.add(List.of(values)); } } catch (IOException e) { System.err.format("Error occurred during processing %s\n", filePath); e.printStackTrace(); } return records; } } ``` 这段代码定义了一个名为 `CSVReaderUtil` 的公共类,其中包含了用来解析CSV文件的方法[^2]。 使用了标准库中的 `BufferedReader` 和 `FileReader` 来逐行读取文件,并利用字符串分割功能将每一行拆分为多个字段存储到列表里。 #### 测试CSVReaderUtil 功能 接下来编写一段简单的测试程序来验证上述工具类的功能是否正常工作: ```java public class TestCSVReader { public static void main(String[] args){ // 假设有一个叫做 "data.csv" 的CSV文件位于项目的根目录下 List<List<String>> data = CSVReaderUtil.readCsvFile("./data.csv"); // 输出所有已读取的数据行 for(var record : data){ System.out.println(record.toString()); } } } ``` 这个例子假设存在一个名为 `"data.csv"` 的CSV文件放在当前工程的工作空间内。运行此应用程序将会打印出CSV文件里的全部内容[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成伟平2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值