Java实现将类数据逐行写入CSV文件的方法详解

 更新时间:2022年11月9日 17:46  点击:268 作者:Toblerone_Wind

1. 需求和思路

最近要用java制作一个数据集,每一行是一个样本,格式是csv。用了一下java类的相关概念,把csv文件里的每一行,即每一个样本视为一个类。

2. 现有方法

目前已有的csv包如opencsv,可以支持字符串,也可以支持javabean(即java类)。相关教程如下

Java OpenCSV|极客教程

由于墙的原因,我maven老是下载不到opencsv的jar包,没办法我只能手写个平民版的

3. 代码

自定义的CodeObject类

public class CodeObject {
    private String filePath;
    private String methodName;
    private String content;
 
    public void setFilePath(String filePath){ this.filePath = filePath;}
    public void setMethodName(String methodName) { this.methodName = methodName;}
    public void setContent(String content) { this.content = content;}
 
    public String getFilePath() { return filePath;}
    public String getMethodName() { return methodName;}
    public String getContent() { return content;}
}

mycsv类

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
 
public class mycsv {
    private File csvFile;
 
    public mycsv(String fileName){
        try {
            csvFile = new File(fileName);
            if (!csvFile.exists()){
                csvFile.createNewFile();
            }
        }catch (IOException e){
            System.out.println("error in io");
        }
    }
    public void writeCSVFile(String header[], ArrayList<CodeObject> cos){
        try{
            FileWriter fw  = new FileWriter(csvFile);
            BufferedWriter bw = new BufferedWriter(fw);
            // 写表头
            for (int i = 0; i < header.length; i++){
                if (i < header.length-1){
                    bw.append(header[i] + ",");
                }else{
                    bw.append(header[i] + "\r\n");
                }
            }
            // 写数据
            for(CodeObject co: cos){
                bw.append(co.getFilePath()+",");
                bw.append(co.getMethodName()+",");
                bw.append(CSVFormatter(co.getContent())+"\r\n");
            }
            bw.close();
            fw.close();
        }catch (IOException e){
            System.out.println("error in io");
        }
    }
    public String CSVFormatter(String s){
        if (s == null) {
            return "";
        }
        if (s.contains("\"")) {
            s = s.replaceAll("\"", "\"\"");
        }
        return "\"" + s + "\"";
    }
}

调用方式

public static void main(String[] args) {
        ArrayList<CodeObject> methods = new ArrayList<>();
        /*
            一些操作将数据写入methods中
        */
        String header[] = {"FilePath", "MethodName", "Content"};
        mycsv m = new mycsv("a.csv");
        m.writeCSVFile(header, methods);
}

4. 参考

因为我做的是把java文件里的方法切分开,每一个方法视为一个样本,content的部分就是方法的代码。由于方法里面有各种字符,如引号,直接写入csv会出现错位、串行、串列的问题。于是我在mycsv里面加了一个CSVFormatter,这块代码主要参考了下文。

Java处理CSV文件中的换行符等字符

开发的时候需要导出一批数据,为了方便使用的CSV格式。当时就只是简单的用逗号分隔,但是因为部分字段含有换行符、引号、逗号,导致用Excel打开的时候部分数据错位了,于是又将那几个字段处理了一下。

CSV文件本质是一种用逗号和(回车)换行符分割的文本文件,是可以直接中Excel打开的。

处理方式就是在这个字段前后添加双引号,并且将字段中原有的双引号替换为两个双引号。

/**
 * @author pzzhao
 * @version 创建时间:2022-5-8 14:46
 */
public class CsvUtils {

    /**
     * @description: 处理csv文件字段中需要转义的引号
     *               添加双引号,防止被字段中的逗号和换行符干扰
     *               使其显示为一个单元格
     * @param value 待处理的字段值
     * @return: {@link String}
     * @author: pzzhao
     * @date: 2022-05-08 14:49:46
     */
    public static String processValueForCsv(String value) {
        if (value == null) {
            return "";
        }

        if (value.contains("\"")) {
            value = value.replaceAll("\"", "\"\"");
        }
         value = "\"" + value + "\"";

        return value;
    }
}

网上有很多现成的CSV工具类的,使用的时候建议还是使用成熟的工具类,也就不用操心这些转义字符的问题了。hutool 工具类里就有现成的CsvUtil。我这个是懒得引用额外的包,所以就自己简单处理了。

下面附上CSV文件个规则:

  • 开头是不留空,以行为单位。
  • 可含或不含列名,含列名则居文件第一行。
  • 一行数据不跨行,无空行。
  • 以半角英文逗号(即,)作分隔符,列为空也要表达其存在。
  • 列内容如存在半角引号(即"),替换成半角双引号(“”)转义,即用半角引号(即"")将该字段值包含起来。
  • 文件读写时引号,逗号操作规则互逆。
  • 内码格式不限,可为 ASCII、Unicode 或者其他。
  • 不支持数字
  • 不支持特殊字符

到此这篇关于Java实现将类数据逐行写入CSV文件的方法详解的文章就介绍到这了,更多相关Java类数据写入CSV文件内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.csdn.net/qq_42276781/article/details/127738206

[!--infotagslink--]

相关文章

  • Java实现经典游戏复杂迷宫

    这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
  • java 运行报错has been compiled by a more recent version of the Java Runtime

    java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • 在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • php简单数据操作的实例

    最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
  • 解决Mybatis 大数据量的批量insert问题

    这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
  • Antd-vue Table组件添加Click事件,实现点击某行数据教程

    这篇文章主要介绍了Antd-vue Table组件添加Click事件,实现点击某行数据教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-17
  • 详解如何清理redis集群的所有数据

    这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
  • 教你怎么用Java获取国家法定节假日

    这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
  • pandas pd.read_csv()函数中parse_dates()参数的用法说明

    这篇文章主要介绍了pandas pd.read_csv()函数中parse_dates()参数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-05
  • Java如何发起http请求的实现(GET/POST)

    这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
  • 浅谈Java与C#的一些细微差别

    说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
  • vue 获取到数据但却渲染不到页面上的解决方法

    这篇文章主要介绍了vue 获取到数据但却渲染不到页面上的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-19
  • mybatis-plus 处理大数据插入太慢的解决

    这篇文章主要介绍了mybatis-plus 处理大数据插入太慢的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-18
  • php把读取xml 文档并转换成json数据代码

    在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
  • 解决Java处理HTTP请求超时的问题

    这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
  • postgresql数据添加两个字段联合唯一的操作

    这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
  • java 判断两个时间段是否重叠的案例

    这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • 超简洁java实现双色球若干注随机号码生成(实例代码)

    这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
  • Java生成随机姓名、性别和年龄的实现示例

    这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01