17

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

 4 years ago
source link: https://segmentfault.com/a/1190000022264025
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
欢迎关注笔者的公众号: 小哈学Java , 专注于推送 Java 领域优质干货文章!!

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

一、背景

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

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

ryyEfmu.jpg!web

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

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

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

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

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

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

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

NjyQziI.gif

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);
    }
}

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

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

FBJZvi7.png!web

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);
    }
}

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

fYJjYn6.png!web

打完收工~

总结

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

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

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

fym2MnY.gif

Ref

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

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

bYJBB3j.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK