如何通过 JavaCSV 类库来优雅地(偷懒)读写 CSV 文件?

欢迎关注笔者的公众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!!

个人博客: https://www.exception.site/essay/how-to-create-read-csv-by-javacsv

一、背景

小哈公司最近准备开发一套新的平台,具体什么平台,因为涉密,这里就不透露了。平台在最终的的技术选型中,其中主要依赖的技术栈是 Apache Flink, 一款 Apache 基金会开源的流处理框架,平台的核心业务都会交给 Flink 去处理,其中包括离线批量任务计算,以及实时任务计算。

PS: 后面小哈也会分享一些 Flink 相关的文章,正在考虑要不要立个 Flag, 出一套 Flink 的入门教程系列文章,主要怕自己太懒了,泼出去的水,收不回来,那就尴尬了~ 🤣

然后呢?和这篇文章的主题啥关系?

哎,别急,听我娓娓道来!主要是我们部门也是第一次接触 Flink, 虽然久闻大名,知道其计算性能极为出众,但是耳听为虚,一番性能测试是是避免不的。

于是,小哈以离线场景为例,模拟实际业务数据,输入源为 csv 编码文件针对不同量级的数据,100w, 1000w, 一亿的数据量做测试,分别看看不同维度的性能指标,如执行耗时、CPU、内存、吞吐量等。

PS: 因为小哈毕竟不是专业的测试人员,这里只是做了一些简单的测试,对 Flink 的性能有个大致的认知即可。小伙伴们如果有需要,可以使用专门的大数据测试工具,如 HiBench。

这里贴一篇美团技术团队出品的文章《流计算框架 Flink 与 Storm 的性能对比》,有兴趣的小伙伴可以看下:

https://tech.meituan.com/2017/11/17/flink-benchmark.html

好了,铺垫了这么多,其实是想水文一篇,没啥技术含量,就是给大家推荐第三方工具库 JavaCSV,用来造一些 csv 测试数据文件,个人觉得它非常地优雅方便 (比较偷懒~ 代码量少~)。

JavaCSV 官网地址https://sourceforge.net/projects/javacsv/

JavaCSV API 说明文档http://javacsv.sourceforge.net/

二、开始

2.1 添加 Maven 依赖

<dependency>
    <groupId>net.sourceforge.javacsv</groupId>
    <artifactId>javacsv</artifactId>
    <version>2.0</version>
</dependency>

2.2 写文件

要如何通过 javacsv生成 CSV 文件呢?参考下面的示例代码:

/**
 * @author 犬小哈(公众号:小哈学Java)
 * @date 2019/4/12
 * @time 下午3:05
 * @discription 读写 csv 文件
 **/
public class ReadAndWriterCsvFlie {

    // 需要写入的 csv 文件路径
    public static final String WRITE_CSV_FILE_PATH = "/Users/a123123/Work/flink-study/write_test.csv";

    /**
     * 生成 csv 文件
     */
    public static void writeCsvFile(String writeCsvFilePath) {
        // 创建 CSV Writer 对象, 参数说明(写入的文件路径,分隔符,编码格式)
        CsvWriter csvWriter = new CsvWriter(writeCsvFilePath,',', Charset.forName("GBK"));

        try {
            // 定义 header 头
            String[] headers = {"订单号", "用户名", "支付金额"};
            // 写入 header 头
            csvWriter.writeRecord(headers);

            // 写入一千条记录
            for (int i = 0; i < 1000; i++) {
                String orderNum = UUID.randomUUID().toString();
                String userName = "用户" + i;
                String payMoney = String.valueOf(i);

                // 写入行
                csvWriter.writeRecord((String[]) Arrays.asList(orderNum, userName, payMoney).toArray());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            csvWriter.close();
        }
    }

    public static void main(String[] args) {
        writeCsvFile(WRITE_CSV_FILE_PATH);
    }
}

通过上面的示例代码,我们就可以很轻松地造一批测试数据,只需要改下需要生成的行数即可。相比较其他的库,代码量还是非常少的。

运行代码,看下最终的效果图:

2.1 读文件

说完了如何通过 javacsv来写 csv 文件,再来说说如何读取 csv 文件,就以上面生成的 csv 文件作为读取源,示例代码如下:

/**
 * @author 犬小哈(公众号:小哈学Java)
 * @date 2019/4/12
 * @time 下午3:05
 * @discription 读写 csv 文件
 **/
public class ReadAndWriterCsvFlie {

    // 需要写入的 csv 文件路径
    public static final String WRITE_CSV_FILE_PATH = "/Users/a123123/Work/flink-study/write_test.csv";

    /**
     * 读取 csv 文件
     */
    public static void readCsvFile(String readCsvFilePath) {
        // 缓存读取的数据
        List<String[]> content = new ArrayList<>();

        try {
            // 创建 CSV Reader 对象, 参数说明(读取的文件路径,分隔符,编码格式)
            CsvReader csvReader = new CsvReader(readCsvFilePath, ',', Charset.forName("GBK"));
            // 跳过表头
            csvReader.readHeaders();

            // 读取除表头外的内容
            while (csvReader.readRecord()) {
                // 读取一整行
                String line = csvReader.getRawRecord();
                System.out.println(line);

                content.add(csvReader.getValues());
            }
            csvReader.close();

            for (int row = 0; row < content.size(); row++) {
                // 读取第 row 行,第 0 列的数据
                String orderNum = content.get(row)[0];
                System.out.println("==> orderNum: " + orderNum);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        readCsvFile(WRITE_CSV_FILE_PATH);
    }
}

运行代码,看下控制台打印效果:

打完收工~

总结

本文小哈主要带着大家了解了一下,如何通过第三方库 JavaCSV来对 csv 文件进行读写操作,实际场景中可能应用并不广泛,更多还是使用统一的文件库,如阿里的 EasyExcel,EasyPOI 等, 小哈这里使用,也仅仅是为了造测试数据而已。

PS: 关于 EasyExcel 使用教程, 小伙伴可以看下小哈之前写的一篇文章:《7 行代码优雅地实现 Excel 文件生成&下载功能》

好了,水文结束,小伙伴们觉得有帮助记得点个再看哈~ 感谢感谢~ 下期见~

Ref

欢迎关注微信公众号: 小哈学Java

更多干货文章,请关注笔者公众号: 小哈学Java (ID: xiaoha_java), 专注于分享Java领域干货文章, 不限于 BAT 面试题分享,Spring Boot, Spring Cloud, 高并发,JVM, 数据库,Docker 容器, ELK 等相关知识,另外,关注回复「资源」,即可获取全文最热的 Java 面试&架构学习资源哟~

关注微信公众号【小哈学Java】,回复【资源】,即可免费无套路领取资源链接哦

693 声望
61 粉丝
0 条评论
推荐阅读
Spring事务传播行为详解
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可...

JerryTse242阅读 122.6k评论 97

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go32阅读 2.4k评论 1

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬14阅读 1.7k

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.6k

封面图
花了半个小时基于 ChatGPT 搭建了一个微信机器人
相信大家最近被 ChatGPT 刷屏了,其实在差不多一个月前就火过一次,不会那会好像只在程序员的圈子里面火起来了,并没有被大众认知到,不知道最近是因为什么又火起来了,而且这次搞的人尽皆知。

Java极客技术12阅读 3k评论 3

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.2k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.7k评论 4

封面图
693 声望
61 粉丝
宣传栏