ToB企服应用市场:ToB评测及商务社交产业平台

标题: 将实体类对象数据存入和读取进csv文件(可追加) [打印本页]

作者: 泉缘泉    时间: 2023-8-30 00:20
标题: 将实体类对象数据存入和读取进csv文件(可追加)
前言

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

  CSV代表逗号分隔值(Comma-Separated Values),是一种常见的文本文件格式,用于存储表格数据,例如电子表格和数据库中的数据。CSV文件以纯文本形式表示数据,其中每行代表一条记录,而每行中的字段则使用逗号或其他特定分隔符来分隔。
CSV文件的基本结构如下:
  1. 字段1,字段2,字段3,字段4,...
  2. 值1,值2,值3,值4,...
  3. 值1,值2,值3,值4,...
  4. ...
复制代码
  在这个结构中,第一行通常是字段名,描述了每个列中存储的数据类型或含义。随后的行包含实际的数据值,每个值对应于其相应列中的字段。
  虽然称为“逗号分隔值”,但实际上分隔符并不一定是逗号。某些情况下,制表符(Tab)或分号等其他字符也可以用作分隔符,具体取决于文件的规范或数据的特定要求。
  以下是一个简单的示例:
  1. 姓名,年龄,性别,城市
  2. Alice,25,女,纽约
  3. Bob,30,男,洛杉矶
  4. Cathy,22,女,芝加哥
复制代码
  CSV文件非常常见,因为它们易于生成和解析,可以被许多不同的应用程序和编程语言处理。例如,许多电子表格软件(如Microsoft Excel、Google Sheets)和数据库系统都支持CSV文件的导入和导出。这使得CSV文件成为在不同系统之间共享数据的一种通用方式。
存入csv文件

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

点击查看
  1. <dependency>
  2.    <groupId>com.opencsv</groupId>
  3.    <artifactId>opencsv</artifactId>
  4.    <version>5.6</version>
  5. </dependency>
复制代码
实体类加注解
  1.     @CsvBindByPosition(position = 0)
  2.     private String eventId;
  3.     @CsvBindByPosition(position = 1)
  4.     private String srcIndex;
  5.     @CsvBindByPosition(position = 2)
  6.     private String srcName;
  7.     @CsvBindByPosition(position = 3)
  8.     private Integer eventType;
  9.     @CsvBindByPosition(position = 4)
  10.     private String happenTime;
  11.     @CsvBindByPosition(position = 5)
  12.     private Integer realValue;
  13.     @CsvBindByPosition(position = 6)
  14.     private Integer isAlarm;
复制代码
进行文件写入操作

new FileOutputStream(file, true)如果填的是true表示是在文件后面追加写入,默认是false,false就会导致后面的覆盖前面的内容。我这边需求是追加写入,所以写的是true。然后采用了时间来命名csv文件,方便后面查询的时候可以按照时间来查询对应的数据。
  1. /**
  2.      * 一行行向CSV写入内容
  3.      *
  4.      * @param
  5.      * @param dataList 数据集合
  6.      * @param
  7.      * @param
  8.      */
  9.     public void writeDataListToCsv(List<DataGram> dataList) {
  10.         //获取项目根目录下的file文件夹路径
  11.         String filePath = System.getProperty("user.dir") + "/file";
  12.         //获取当前时间
  13.         String curTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  14.         String path = null;
  15.         try {
  16.             path = new File(filePath, curTime + "warn.csv").getCanonicalPath();
  17.             File file = new File(path);
  18.             if (!file.exists()) {
  19.                 file.createNewFile();
  20.             }
  21.             OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file, true), Charset.forName("UTF-8"));
  22.             StatefulBeanToCsv<DataGram> statefulBeanToCsv = new StatefulBeanToCsvBuilder<DataGram>(writer)
  23.                     .withApplyQuotesToAll(false)
  24.                     .build();
  25.             try {
  26.                 statefulBeanToCsv.write(dataList);
  27.             } catch (CsvDataTypeMismatchException e) {
  28.                 e.printStackTrace();
  29.             } catch (CsvRequiredFieldEmptyException e) {
  30.                 e.printStackTrace();
  31.             }
  32.             writer.close();
  33.         } catch (IOException e) {
  34.             e.printStackTrace();
  35.         }
  36.     }
复制代码
读取csv文件的内容
  1. /**
  2.      * 基于CsvBindByPosition注解映射的读取
  3.      *
  4.      *
  5.      */
  6.     public List csvToBeanByPositionAnnotation() {
  7.         String filePath = System.getProperty("user.dir") + "/file";
  8.         String curTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  9.         String path = null;
  10.         try {
  11.             path = new File(filePath, curTime + "warn.csv").getCanonicalPath();
  12.             File fileLast = new File(path);
  13.             if (fileLast.exists()){
  14.                 InputStreamReader reader = new InputStreamReader(new FileInputStream(path), Charset.forName("UTF-8"));
  15.                 // 不需要标题行,列的顺序通过CsvBindByPosition注解的position属性指定
  16.                 CsvToBean<DataGram> csvToBean = new CsvToBeanBuilder<DataGram>(reader)
  17.                         .withType(DataGram.class)
  18.                         .build();
  19.                 List<DataGram> list = csvToBean.parse();
  20.                 reader.close();
  21.                 return list;
  22.         }
  23.         } catch (IOException e) {
  24.             e.printStackTrace();
  25.         }
  26.         return null;
  27.     }
复制代码
效果展示
  1.         DataGram dataGram = new DataGram("1","2","3",4,"5",7,9);
  2.         DataGram dataGram1 = new DataGram("a","b","c",2,"e",2,2);
  3.         List<DataGram> list = new ArrayList<>();
  4.         list.add(dataGram);
  5.         list.add(dataGram1);
  6.         writeDataListToCsv(list);
复制代码
  1. List list = csvToBeanByPositionAnnotation();
  2.         System.out.print(list);
复制代码

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4