Java实现将类数据逐行写入CSV文件的方法详解
作者:Toblerone_Wind 发布时间:2023-02-27 17:11:11
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 或者其他。
不支持数字
不支持特殊字符
来源:https://blog.csdn.net/qq_42276781/article/details/127738206
猜你喜欢
- 1、研究背景 在当今信息社会发展中中,计算机科
- state:比较常用,各种状态都可以用它,但是它更着重于一种心理状态或者物理状态。Status:用在人的身上一般是其身份和地位,作“状态,情
- easyExcel简介:Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的
- 开门见山在IT圈里,每当我们谈论并发时,必定会说起在一台计算机上同时运行的一系列线程。如果这台电脑上有多个处理器或者是一个多核处理器,那么这
- jwt简介冒泡排序:(Bubble Sort)是一种简单的交换排序。之所以叫做冒泡排序,因为我们可以把每个元素当成一个小气泡,根据气泡大小,
- 使用wait()和notify()实现Java多线程通信:两个线程交替打印A和B,如ABABABpublic class Test { &n
- 前言:学习过我的mall项目的应该知道,mall-admin模块是使用SpringSecurity+JWT来实现登录认证的,而mall-po
- Executor接口基于以下方法可以完成增,删,改查以及事务处理等操作。事实上,mybatis中的所有数据库操作是通过调用这些方法实现的。p
- 目录概述准备工作使用概述springboot通常整合redis,采用的是RedisTemplate的形式,除了这种形式以外,还有另外一种形式
- 前言:各位小伙伴们,大家好,一日不见,如隔一日,今天我给大家分享一下大家在学习java过程当中遇到的一个问题,也是一道面试题,java中,O
- 本文实例为大家分享了java图形用户界面实现菜单功能的具体代码,供大家参考,具体内容如下题目:编写一个图形用户界面,实现菜单的功能。有3个一
- 介绍:上篇给大家介绍了ssm多模块项目的搭建,在搭建过程中spring整合springmvc和mybatis时会有很多的东西需要我们进行配置
- 今天来说一个Java多机部署下定时任务的处理方案。需求: 有两台服务器同时部署了同一套代码, 代码中写有spring自带的定时任务,但是每次
- 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理
- 今天介绍一个实用的小知识点,如何将List转为Map<Object, List<Object>>1. 基本写法最开始
- Springboot整合RockerMQ1、maven依赖<dependencies> <!--
- 什么是代理模式?代理模式:在调用处不直接调用目标类进行操作,而是调用代理类,然后通过代理类来调用目标类进行操作。在代理类调用目标类的前后可以
- BigDecimal类对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDe
- 本文实例讲述了Java常用内置注解。分享给大家供大家参考,具体如下:一 通过@SuppressWarnings关闭警告信息1 代码publi
- Java常用类包装类由于Java语言中的基本类型不是面向对象,并不具备对象的性质,实际使用存在很多不便。Java在java.lang包中提供