Java实现CSV读写

2023-11-17

在开发过程中经常需要处理csv文件,我一般是实现一个CSVHelper,封装一些对csv文件的基本操作,代码中直接使用封装好的CSVHelper来读写csv文件就可以了。今天就来记录一下如何通过Java实现封装的csv文件的读写。对于C#实现csv的读写,数据结构可以使用DataTable,但是Java没有这种对象,我用的嵌套List存储数据。

在看具体的代码之前,先来了解一下csv文件是什么,长什么样子。

1. 什么是csv文件?

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。所有记录都有完全相同的字段序列。

2.csv文件长什么样子

csv文件的扩展名是*.csv,可以通过Excel直接打开,或者通过Notepad++等文本编辑器打开。打开后的文件内容大致类似于如下样子:

IssueId,ProjectId
1111,m1811
2222,m1852

3.代码实现封装的CSVHelper

(1)读取csv文件

 /**
     * 读取CSV文件
     * @param filePath 文件路径(包括文件名)
     * @param hasTitle 是否有标题行
     * @return
     */
    public static List<List<String>> readCSV(String filePath, boolean hasTitle){
        List<List<String>> data=new ArrayList<>();
        String line=null;
        try {
            //BufferedReader bufferedReader=new BufferedReader(new FileReader(filePath));
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"utf-8"));
            if (hasTitle){
                //第一行信息,为标题信息
                line = bufferedReader.readLine();
                String[] items=line.split(",");
                data.add(Arrays.asList(items));
                System.out.println("标题行:"+line);
            }

            int i=0;
            while((line=bufferedReader.readLine())!=null){
                i++;
                //数据行
                String[] items=line.split(",");
                data.add(Arrays.asList(items));
                System.out.println("第"+i+"行:"+line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return data;
    }

测试以上代码:前提需要准备一个有数据的csv文件,然后调用上述readCSV()方法即可,如下:

(2)向csv文件中写数据

  /**
     * 写CSV文件
     * @param data 数据
     * @param filePath 文件路径
     * @param fileName 文件名
     * @param hasTitle 是否有标题行
     */
    public static void  writeCSV(List<List<String>> data, String filePath,String fileName,boolean hasTitle){
        File csvFile=new File(filePath+"/"+fileName);
        BufferedWriter bufferedWriter=null;
        String line=null;
        try {
           // bufferedWriter=new BufferedWriter(new FileWriter(csvFile,true));
            bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile),"utf-8"));
          for (int i=0;i<data.size();i++){
              line=null;
              if (hasTitle){
                  line=getLine(data.get(i));
              }
              System.out.println(line.toString());
              bufferedWriter.write(line.toString());
              bufferedWriter.newLine();
          }
            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

有一些小伙伴在问getLine的方法,其实这个方法很简单。csv每行其实是由csv分割符组成的一个字符串,getLine就是通过List<String>拼成符合csv格式的字符串返回的。

/**
     * 获取一行数据的csv格式的字符串
     * @param items
     * @return
     */
    private static String getLine(List<String> items){
        StringBuilder line=new StringBuilder();
        for (int i=0;i<items.size();i++){
            line.append(items.get(i));
            if (i<(items.size()-1)){
                line.append(",");
            }
        }
        return line.toString();
    }

测试以上写入代码:需要准备要写入的数据,然后调用上述的writeCSV方法,如下:

Github: CSVHelper的源码和测试类

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现CSV读写 的相关文章

  • 超分辨率重建测试(DASR)

    测试链接 GitHub LongguangWang DASR CVPR 2021 Unsupervised Degradation Representation Learning for Blind Super Resolutionhttp
  • vue3项目实战---知乎日报----项目搭建

    目录 基础框架和响应式布局 项目介绍 接口文档 vue config pagejson 初始化公共样式 vuex模块 路由模块 utils公共类库 axios 二次封装 响应式处理 vant ui组件库 基础框架和响应式布局 项目介绍 知乎
  • 基于VMWare 16虚拟机 CentOS7linux系统SFTP服务器的搭建与数据上载传输

    文章目录 写在前面 1 SFTP协议 2 SFTP服务器搭建 2 1 windows中SFTP服务器搭建 2 2 linux系统的SFTP服务器搭建 2 2 1 通过su命令 进入管理员权限 2 2 2 创建sftp组 2 2 3 创建一个
  • Vulnhub-DC-1实战靶场

    目录 前言 一 环境搭建 1 准备工具 2 靶场准备 二 渗透过程 1 信息收集 探测目标IP地址 探测目标IP开放端口 网页信息收集 2 漏洞查找与利用 2 1弱口令 2 2Drupalgeddon2 3 Getshell 3 1交互式s
  • Android mtk 添加app编译进系统

    1 根目录下device 搜索devices mk find iname device mk 找出device mediatek common device mk文件添加 endif Add for mediaextractor proce
  • Maven 生成source 文件 Jar

    TOC Maven 生成source 文件 Jar Maven 生成source 文件 Jar Add maven source plugin in your pom xml file
  • win11 vmware 显示 “未能启动虚拟机“ 解决办法

    编辑虚拟机文件 xxx vmx 修改其中的一行内容 virtualHW version 18
  • jQuery操作css方法

    目录 一 jQuery可以使用css方法来修改元素样式 二 设置类的样式方法 1 添加类 2 移除类 3 切换类 三 类操作与className区别 四 显示隐藏效果 1 显示语法 2 隐藏语法 3 切换语法 五 滑动效果 1 上滑效果语法
  • sql注入之报错注入

    报错注入 报错注入在没法用union联合查询时用 但前提还是不能过滤一些关键的函数 报错注入就是利用了数据库的某些机制 人为地制造错误条件 使得查询结果能够出现在错误信息中 这里主要记录一下xpath语法错误和concat rand gro
  • 某**集团夺旗赛的一道隐写题

    解压压缩包 解压出来一个文件file 使用file命令进行查看 发现是data 010查看也无果 看到标题是logistic联想到是否与xor文件有关 遂使用工具xortool 工具在此 xortool file 选概率最大的那个 13 x
  • HDFS API操作的访问方式及JUnit测试类的使用

    HDFS API操作的访问方式 主要分为使用文件系统访问方式和URL访问方式 package com wyg hdfs import java io File import java io FileOutputStream import j
  • hive 高级分组聚合(grouping sets cube和rollup)

    1 grouping sets 1 1 select a b sum c from tbl group by a b grouping sets a b 相当于 select a b sum c from tbl group by a b
  • Python求1-100所有奇数和的方法!

    在之前的文章中 老男孩IT教育小编为大家介绍过Python的特点 优势 用途以及薪资待遇等知识 而为了帮助大家更好的掌握Python 小编将为大家讲解一些实战案例 比如 Python中如何求1 100的奇数和 接下来我们来看看吧 Pytho
  • Stable Diffusion安装教程、model导入教程以及精品promt指令

    文章目录 引言 原理 图片感知压缩 潜在扩散模型 安装 插件 插件与模型下载 常用promt关键字 交流讨论 引言 最近大火的AI作画吸引了很多人的目光 AI作画近期取得如此巨大进展的原因个人认为有很大的功劳归属于Stable Diffus
  • 读取sftp服务器上的文件内容到指定的数据库表内

    引入sftp jar依赖
  • 一些常用的公共js方法

    读者可能会觉得节流与防抖有点像 其实仔细斟酌就能发现他们的不同 节流是指对于连续触发的事件 每隔一段固定时间执行一次 只要事件持续出发就可以执行很多次 在节流里涉及的时间主要是指事件执行的间隔时间 防抖则是对连续触发的事件 只会执行一次 不
  • 从操作系统层面理解同步、异步、阻塞、非阻塞

    同步和异步描述调用者会不会主动等待函数的返回值 举个例子 public void method int result otherMethod 像上面这种形式就叫同步 result 会一直等待 otherMethod 方法执行完毕并拿到返回值
  • BMVC2022

    原文标题 Hierarchical Residual Learning Based Vector Quantized Variational Autoencoder for Image Reconstruction and Generati

随机推荐

  • 运行 Triton 示例

    安装 Triton Docker 镜像 在拉取镜像前 需要安装 Docker 和 NVIDIA Container Toolkit 用以下命令拉取镜像 docker pull nvcr io nvidia tritonserver
  • VTK编译方法

    VTK编译方法 VTK Group Imaging ON VTK Group MPI ON VTK Group QT ON VTK Group TK ON VTK Group Views ON VTK RENDERING BACKEND O
  • 使用layui/layuiAdmin的总结

    layui是一个前端UI框架 主要是配合JQuery使用 开始使用 首先是下载文件 然后引入css和js文件 引入之后就需要在
  • 以太坊开发入门,完整入门

    翻译自 https medium com mattcondon getting up to speed on ethereum 63ed28821bbe 从入门到精通 干货篇 必读 如果你 是一个专业的程序员 如果你想了解以太坊当前可以做到
  • QT QTabWidget 、布局控件 动态添加窗口(控件)、删除窗口(控件)方案

    new 一个窗口或者控件 QTabWidget addTab 将新建的控件放到一个容器中 比如 QMap
  • mybatis查询

    以后返回统一用对象 resultMap 查询 基本查询 select from person where person id id 条件查询 分页 select from cobra apply store yjs user id yjsU
  • 递归的一种应用

    有些问题 涉及两个对象 比如两个数 像个长度不同的数组 链表之类的 必须考虑是前者大还是后者大的情况 分别处理 其实可以只处理一种情况 比如前者小 后者大的情况 另一种情况 前者大后者小 可以通过交换参数 递归调用本函数来处理
  • ArrayList与顺序表

    文章目录 一 顺序表是什么 二 ArrayList是什么 三 ArrayList的构造方法 四 ArrayList的常见方法 4 1 add 4 2 size 4 3 remove 4 4 get 4 5 set 4 6 contains
  • kali linux中如何安装中文输入法

    前言 在使用kali linux中 我们可能用到中文输入法 那么我们该如何安装中文输入法呢 正文 一 首先 我们需要检查更新源是否可用 如果可用我们就进行第二步 如果不可用 我们则需要手动添加更新源 手动添加更新源 我们需要到网上找到最新的
  • 云原生安全性:构建可信任的云应用的最佳实践

    文章目录 云原生安全性的重要性 1 数据隐私 2 恶意攻击 3 合规性要求 4 业务连续性 构建可信任的云应用的最佳实践 1 安全开发 2 身份验证与授权 3 容器安全性 4 监控与审计 5 持续集成与持续交付 CI CD 6 安全培训和教
  • 制作树莓派img镜像文件

    想做个树莓派的img镜像 然而对SD卡进行全盘复制很浪费空间 且不能恢复到比现有SD卡容量小的卡上 因此探索制作小img的方法 网上看了大神制作的脚本 比如https github com conanwhf RaspberryPi scri
  • MySQL索引原理详解

    目录 一 数据结构 1 1 二叉树 为什么索引的数据结构不用二叉树 1 2 红黑树 自平衡二叉查找树 为什么索引的数据结构不用红黑树 1 3 B树 多路平衡搜索树 为什么索引的数据结构不用B树 1 4 B 树 1 5 MySQL B 树 1
  • QML的Label实现Tooltip提示效果

    在用QML进行界面设计时 往往需要用到Label 但是由于界面宽度的限制 Label会显示不全 需要进行Tooltip进行提示 而QML中的Label本身还不支持Tooltip的提示功能 所以给开发带来了一定的困难 那么 遇到这种问题 该怎
  • SpringBoot中使用ThreadPoolExecutor和ThreadPoolTaskExecutor线程池的方法和区别

    Java中经常用到多线程来处理业务 在多线程的使用中 非常的不建议使用单纯的Thread或者实现Runnable接口的方式来创建线程 因为这样的线程创建及销毁势必会造成耗费资源 线程上下文切换问题 同时创建过多的线程也可能会引发资源耗尽的风
  • 【计算机操作系统】第二章 进程管理

    1 进程的基本概念 1 1 程序的顺序执行和特征 程序顺序执行时的特征 顺序性 处理机的操作严格按照程序所规定的顺序执行 即每一操作必须在上一个操作结束之后开始 封闭性 程序是在封闭的环境下执行的 即程序运行时独占全机资源 资源的状态 除初
  • 大数据课程C5——ZooKeeper的应用组件

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 掌握Zookeeper的Canal消费组件 掌握Zookeeper的Dubbo分布式服务框架 掌握Zookeeper的Metamorphosis消息中间件 掌
  • 快速性分析 一阶、二阶系统响应

    自控笔记 3 3一阶系统的时间响应及动态性能 一 一阶系统的数学模型 凡是以一阶微分方程作为运动方程的控制系统 称为一阶系统 其数学模型为 时间常数T是表征系统响应的唯一参数 T越小 输出响应上升得越快 调节时间越小 二 一阶系统的典型响应
  • 华为OD机试 - 符合要求的元组的个数(Java & JS & Python)

    题目描述 给定一个整数数组 nums 一个数字k 一个整数目标值 target 请问nums中是否存在k个元素使得其相加结果为target 请输出所有符合条件且不重复的k元组的个数 数据范围 2 nums length 200 10 9 n
  • Java Thread.currentThread()方法具有什么功能呢?

    转自 Java Thread currentThread 方法具有什么功能呢 下文讲述Thread currentThread 方法的功能简介说明 如下所示 Thread currentThread 方法的功能 返回当前线程 注意事项 Th
  • Java实现CSV读写

    在开发过程中经常需要处理csv文件 我一般是实现一个CSVHelper 封装一些对csv文件的基本操作 代码中直接使用封装好的CSVHelper来读写csv文件就可以了 今天就来记录一下如何通过Java实现封装的csv文件的读写 对于C 实