如何通過 JavaCSV 類庫來優雅地(偷懶)讀寫 CSV 檔案?

犬小哈發表於2020-04-04

歡迎關注筆者的公眾號: 小哈學Java, 專注於推送 Java 領域優質乾貨文章!!

個人部落格: www.exception.site/essay/how-t…

一、背景

小哈公司最近準備開發一套新的平臺,具體什麼平臺,因為涉密,這裡就不透露了。平臺在最終的的技術選型中,其中主要依賴的技術棧是 Apache Flink, 一款 Apache 基金會開源的流處理框架,平臺的核心業務都會交給 Flink 去處理,其中包括離線批量任務計算,以及實時任務計算。

PS: 後面小哈也會分享一些 Flink 相關的文章,正在考慮要不要立個 Flag, 出一套 Flink 的入門教程系列文章,主要怕自己太懶了,潑出去的水,收不回來,那就尷尬了~ ?

如何通過 JavaCSV 類庫來優雅地(偷懶)讀寫 CSV 檔案?

然後呢?和這篇文章的主題啥關係?

哎,別急,聽我娓娓道來!主要是我們部門也是第一次接觸 Flink, 雖然久聞大名,知道其計算效能極為出眾,但是耳聽為虛,一番效能測試是是避免不的。

於是,小哈以離線場景為例,模擬實際業務資料,輸入源為 csv 編碼檔案針對不同量級的資料,100w, 1000w, 一億的資料量做測試,分別看看不同維度的效能指標,如執行耗時、CPU、記憶體、吞吐量等。

PS: 因為小哈畢竟不是專業的測試人員,這裡只是做了一些簡單的測試,對 Flink 的效能有個大致的認知即可。小夥伴們如果有需要,可以使用專門的大資料測試工具,如 HiBench。

這裡貼一篇美團技術團隊出品的文章《流計算框架 Flink 與 Storm 的效能對比》,有興趣的小夥伴可以看下:

tech.meituan.com/2017/11/17/…

好了,鋪墊了這麼多,其實是想水文一篇,沒啥技術含量,就是給大家推薦第三方工具庫 JavaCSV,用來造一些 csv 測試資料檔案,個人覺得它非常地優雅方便 (比較偷懶~ 程式碼量少~)。

如何通過 JavaCSV 類庫來優雅地(偷懶)讀寫 CSV 檔案?

JavaCSV 官網地址sourceforge.net/projects/ja…

JavaCSV API 說明文件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);
    }
}
複製程式碼

通過上面的示例程式碼,我們就可以很輕鬆地造一批測試資料,只需要改下需要生成的行數即可。相比較其他的庫,程式碼量還是非常少的。

執行程式碼,看下最終的效果圖:

如何通過 JavaCSV 類庫來優雅地(偷懶)讀寫 CSV 檔案?

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 檔案?

打完收工~

總結

本文小哈主要帶著大家瞭解了一下,如何通過第三方庫 JavaCSV來對 csv 檔案進行讀寫操作,實際場景中可能應用並不廣泛,更多還是使用統一的檔案庫,如阿里的 EasyExcel,EasyPOI 等, 小哈這裡使用,也僅僅是為了造測試資料而已。

PS: 關於 EasyExcel 使用教程, 小夥伴可以看下小哈之前寫的一篇文章:《7 行程式碼優雅地實現 Excel 檔案生成&下載功能》

好了,水文結束,小夥伴們覺得有幫助記得點個再看哈~ 感謝感謝~ 下期見~

如何通過 JavaCSV 類庫來優雅地(偷懶)讀寫 CSV 檔案?

Ref

歡迎關注微信公眾號: 小哈學Java

更多幹貨文章,請關注筆者公眾號: 小哈學Java (ID: xiaoha_java), 專注於分享Java領域乾貨文章, 不限於 BAT 面試題分享,Spring Boot, Spring Cloud, 高併發,JVM, 資料庫,Docker 容器, ELK 等相關知識,另外,關注回覆「資源」,即可獲取全文最熱的 Java 面試&架構學習資源喲~

關注微信公眾號【小哈學Java】,回覆【資源】,即可免費無套路領取資源連結哦

相關文章