前言

最近公司一个新的项目,因为需要存储的数据很少,单独去部署一个数据库去存储该数据显然是不划算的,所以想的是通过存入csv文件中来代替存入数据库中。说干就干。

什么是csv文件

CSV代表逗号分隔值(Comma-Separated Values),是一种常见的文本文件格式,用于存储表格数据,例如电子表格和数据库中的数据。CSV文件以纯文本形式表示数据,其中每行代表一条记录,而每行中的字段则使用逗号或其他特定分隔符来分隔。

CSV文件的基本结构如下:

字段1,字段2,字段3,字段4,...
值1,值2,值3,值4,...
值1,值2,值3,值4,...
...

在这个结构中,第一行通常是字段名,描述了每个列中存储的数据类型或含义。随后的行包含实际的数据值,每个值对应于其相应列中的字段。

虽然称为“逗号分隔值”,但实际上分隔符并不一定是逗号。某些情况下,制表符(Tab)或分号等其他字符也可以用作分隔符,具体取决于文件的规范或数据的特定要求。

以下是一个简单的示例:

姓名,年龄,性别,城市
Alice,25,女,纽约
Bob,30,男,洛杉矶
Cathy,22,女,芝加哥

CSV文件非常常见,因为它们易于生成和解析,可以被许多不同的应用程序和编程语言处理。例如,许多电子表格软件(如Microsoft Excel、Google Sheets)和数据库系统都支持CSV文件的导入和导出。这使得CSV文件成为在不同系统之间共享数据的一种通用方式。

存入csv文件

其实存入csv文件有很多种方法,今天我们主要讲的是@CsvBindByPosition注解的方式。

导入相应的依赖

点击查看
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.6</version>
</dependency>

实体类加注解

    @CsvBindByPosition(position = 0)
private String eventId; @CsvBindByPosition(position = 1)
private String srcIndex; @CsvBindByPosition(position = 2)
private String srcName; @CsvBindByPosition(position = 3)
private Integer eventType; @CsvBindByPosition(position = 4)
private String happenTime; @CsvBindByPosition(position = 5)
private Integer realValue; @CsvBindByPosition(position = 6)
private Integer isAlarm;

进行文件写入操作

new FileOutputStream(file, true)如果填的是true表示是在文件后面追加写入,默认是false,false就会导致后面的覆盖前面的内容。我这边需求是追加写入,所以写的是true。然后采用了时间来命名csv文件,方便后面查询的时候可以按照时间来查询对应的数据。

/**
* 一行行向CSV写入内容
*
* @param
* @param dataList 数据集合
* @param
* @param
*/
public void writeDataListToCsv(List<DataGram> dataList) {
//获取项目根目录下的file文件夹路径
String filePath = System.getProperty("user.dir") + "/file";
//获取当前时间
String curTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String path = null;
try {
path = new File(filePath, curTime + "warn.csv").getCanonicalPath();
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file, true), Charset.forName("UTF-8")); StatefulBeanToCsv<DataGram> statefulBeanToCsv = new StatefulBeanToCsvBuilder<DataGram>(writer)
.withApplyQuotesToAll(false)
.build();
try {
statefulBeanToCsv.write(dataList);
} catch (CsvDataTypeMismatchException e) {
e.printStackTrace();
} catch (CsvRequiredFieldEmptyException e) {
e.printStackTrace();
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}

读取csv文件的内容

/**
* 基于CsvBindByPosition注解映射的读取
*
*
*/
public List csvToBeanByPositionAnnotation() {
String filePath = System.getProperty("user.dir") + "/file";
String curTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String path = null;
try {
path = new File(filePath, curTime + "warn.csv").getCanonicalPath();
File fileLast = new File(path);
if (fileLast.exists()){
InputStreamReader reader = new InputStreamReader(new FileInputStream(path), Charset.forName("UTF-8"));
// 不需要标题行,列的顺序通过CsvBindByPosition注解的position属性指定
CsvToBean<DataGram> csvToBean = new CsvToBeanBuilder<DataGram>(reader)
.withType(DataGram.class)
.build();
List<DataGram> list = csvToBean.parse();
reader.close();
return list;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

效果展示

        DataGram dataGram = new DataGram("1","2","3",4,"5",7,9);
DataGram dataGram1 = new DataGram("a","b","c",2,"e",2,2);
List<DataGram> list = new ArrayList<>();
list.add(dataGram);
list.add(dataGram1);
writeDataListToCsv(list);

List list = csvToBeanByPositionAnnotation();
System.out.print(list);


至此所有的操作都完成了,当然面对不同的需求会有不同的写入方法,写入csv文件的方法肯定也不会只有这一种。感谢大家观看。

将实体类对象数据存入和读取进csv文件(可追加)的更多相关文章

  1. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  2. ado.net 实体类_数据访问类

    实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  3. 9_13学习完整修改和查询&&实体类,数据访问类

    完整修改和查询:中间变量运用. 1.先查 2.执行操作 ---------------------------------------------------- namespace ADO.NET_小 ...

  4. ADO.NET(完整修改和查询、实体类,数据访问类)

    一.完整修改和查询 在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到. 中间变量运用. 1.先查 2.执行操作 完整修改语句: bool has = ...

  5. .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表

    /// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr&quo ...

  6. java中json字符串与实体类对象相互转换

    1.问题描述 有一个需求是这样的,把实体类转为Json字符串存入redis中,然后再把redis中存放的实体类Json字符串插入数据库中.因此需要涉及到json字符串与实体类对象的相互转换. 2.产生 ...

  7. NSDictionary转化为实体类对象

    方法一: 使用objective-c NSObject自带的方法 setValuesForKeysWithDictionary:dict 作用是: 如果NSDictionary中的key和实体类对象的 ...

  8. java 获取实体类对象属性值的方法

    在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...

  9. 如何导出标准模板库(STL)类的实例化和包含STL类对象数据成员的类

    本文翻译自 https://support.microsoft.com/zh-cn/help/168958/how-to-export-an-instantiation-of-a-standard-t ...

  10. @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法

    JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...

随机推荐

  1. 2021-10-09:杨辉三角。给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。力扣118。

    2021-10-09:杨辉三角.给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行.在「杨辉三角」中,每个数是它左上方和右上方的数的和.力扣118. 福大大 答案2021-10 ...

  2. 认识CPU底层原理(1)——MOSFET

    本文为B站UP主硬件茶谈制作的系列科普<[硬件科普]带你认识CPU>系列的学习笔记,仅作个人学习记录使用,如有侵权,请联系博主删除 近年来,由于国内外各种因素影响,半导体行业逐渐被推向风口 ...

  3. harbor改造为https---血泪史

  4. C端用户体验度量实战篇-京东快递小程序体验度量全面升级

    本文通过介绍体验度量模型升级研究过程.研究方法及研究结果等内容,结合实际C端产品应用,观测新模型运行周期的表现,验证了其在高速发展的业务形态和日益变化的用户需求上的适用性和有效性.我们从体验价值为导向 ...

  5. Spring Boot 3.1中如何整合Spring Security和Keycloak

    在今年2月14日的时候,Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器.其中包括Spring Security和Spring Boot的适配器,这意味着今后Keycloak团队 ...

  6. 一文吃透Java并发高频面试题

    内容摘自我的学习网站:topjavaer.cn 分享50道Java并发高频面试题. 线程池 线程池:一个管理线程的池子. 为什么平时都是使用线程池创建线程,直接new一个线程不好吗? 嗯,手动创建线程 ...

  7. mysql和neo4j集成多数据源和事务

    在微服务大行其道的今天,按理说不应该有多数据源这种问题(嗯,主从库算是一个多数据源的很常见的场景.),但是也没人规定不能这样做. 就算有人规定的,曾经被奉为圭臬的数据库三大范式现在被宽表冲得七零八落, ...

  8. Kali Linux的目录结构

    Linux目录和Windows目录有着很大的不同,Linux目录类似一个树,最顶层是其根目录,如下图: kali Linux 目录结构 bin目录 存放二进制可执行文件(如我们常用的 ls ping ...

  9. C#/.Net的多播委托到底是啥?彻底剖析下

    前言 委托在.Net里面被托管代码封装了之后,看起来似乎有些复杂.但是实际上委托即是函数指针,而多播委托,即是函数指针链.本篇来只涉及底层的逻辑,慎入. 概括 1.示例代码 public delega ...

  10. MODBUS-TCP转Ethernet IP 网关连接空压机 配置案例

      本案例是工业现场应用捷米特JM-EIP-TCP的Ethernet/IP转Modbus-TCP网关连接欧姆龙PLC与空压机的配置案例.使用设备:欧姆龙PLC,捷米特JM-EIP-TCP网关, ETH ...