软件编程
位置:首页>> 软件编程>> java编程>> Java实现将类数据逐行写入CSV文件的方法详解

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

作者:Toblerone_Wind  发布时间:2023-02-27 17:11:11 

标签:Java,数据,CSV

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文件个规则:

  • 开头是不留空,以行为单位。

  • 可含或不含列名,含列名则居文件第一行。

  • 一行数据不跨行,无空行。

  • 以半角英文逗号(即,)作分隔符,列为空也要表达其存在。

  • 列内容如存在半角引号(即"),替换成半角双引号(&ldquo;&rdquo;)转义,即用半角引号(即"")将该字段值包含起来。

  • 文件读写时引号,逗号操作规则互逆。

  • 内码格式不限,可为 ASCII、Unicode 或者其他。

  • 不支持数字

  • 不支持特殊字符

来源:https://blog.csdn.net/qq_42276781/article/details/127738206

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com