前言

最近公司一个新的项目,因为需要存储的数据很少,单独去部署一个数据库去存储该数据显然是不划算的,所以想的是通过存入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. 2022-04-27:Alice 有一个下标从 0 开始的数组 arr ,由 n 个正整数组成。她会选择一个任意的 正整数 k 并按下述方式创建两个下标从 0 开始的新整数数组 lower 和 hig

    2022-04-27:Alice 有一个下标从 0 开始的数组 arr ,由 n 个正整数组成.她会选择一个任意的 正整数 k 并按下述方式创建两个下标从 0 开始的新整数数组 lower 和 hig ...

  2. 2022-04-04:k8s中kubectl源码用到了哪些设计模式?除了工厂和单例。

    2022-04-04:k8s中kubectl源码用到了哪些设计模式?除了工厂和单例. 答案2022-04-04: 1.建造者模式.resource.Builder.D:\go_path\src\git ...

  3. docker安装go-fastdfs

    1.docker命令安装 docker run -d --name fastdfs -p 8180:8080 sjqzhang/go-fastdfs 2.浏览器访问 http://192.168.20 ...

  4. 下载与安装Node.js

    下载与安装Node.js 1.下载安装包 Node.js 官方网站下载:https://nodejs.org/en/ 2.安装 这边安装就直接next 安装好后它会自动配置好环境变量 这是我们来到命令 ...

  5. 【汇编】老师太hun

    老师只是随手发实验项目卡,从未提过实验报告的事情 可是 他却要在 复习周 一下子 收6次 实验报告 也不发资料,不说每次的时间点,不讲实验 这人心中有 学生 吗? 上课发 上个班直播的录播 一节课就发 ...

  6. .cur 图片加载提示 You may need an appropriate loader to handle this file type

    最近一个gis 项目需要加载一个.cur的图标,但是编译时提示 You may need an appropriate loader to handle this file type, current ...

  7. Singleton 单例模式简介与 C# 示例【创建型】【设计模式来了】

    〇.简介 1.什么是单例模式? 一句话解释:   单一的类,只能自己来创建唯一的一个对象. 单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一.这种类型的设计模式属于创建型 ...

  8. MySQL的sql语句执行流程(简述)

    导言: MySQL和服务器端对接的时候,我们知道一般就是服务器端会打包一些SQL命令去增删改查数据库,这个打包的数据库SQL语句数据包一般为4MB,再大一些就不会被数据库端接收了 但是我们可以自己更改 ...

  9. Mysql DDL执行方式-pt-osc介绍 | 京东云技术团队

    1 引言 大家好,接着上次和大家一起学习了<MySQL DDL执行方式-Online DDL介绍>,那么今天接着和大家一起学习另一种MySQL DDL执行方式之pt-soc. 在MySQL ...

  10. Java工具类Result<T>

    枚举类:ResultCodeEnum /** * 统一返回结果状态信息类 * */ @Getter public enum ResultCodeEnum { SUCCESS(200,"成功& ...