一文秒懂通過JavaCSV類庫(kù)讀寫CSV文件的技巧
一、背景
小哈公司最近準(zhǔn)備開發(fā)一套新的平臺(tái),具體什么平臺(tái),因?yàn)樯婷?,這里就不透露了。平臺(tái)在最終的的技術(shù)選型中,其中主要依賴的技術(shù)棧是 Apache Flink, 一款 Apache 基金會(huì)開源的流處理框架,平臺(tái)的核心業(yè)務(wù)都會(huì)交給 Flink 去處理,其中包括離線批量任務(wù)計(jì)算,以及實(shí)時(shí)任務(wù)計(jì)算。
PS: 后面小哈也會(huì)分享一些 Flink 相關(guān)的文章,正在考慮要不要立個(gè) Flag, 出一套 Flink 的入門教程系列文章,主要怕自己太懶了,潑出去的水,收不回來,那就尷尬了~ 🤣
然后呢?和這篇文章的主題啥關(guān)系?
哎,別急,聽我娓娓道來!主要是我們部門也是第一次接觸 Flink, 雖然久聞大名,知道其計(jì)算性能極為出眾,但是耳聽為虛,一番性能測(cè)試是是避免不的。
于是,小哈以離線場(chǎng)景為例,模擬實(shí)際業(yè)務(wù)數(shù)據(jù),輸入源為 csv 編碼文件針對(duì)不同量級(jí)的數(shù)據(jù),100w, 1000w, 一億的數(shù)據(jù)量做測(cè)試,分別看看不同維度的性能指標(biāo),如執(zhí)行耗時(shí)、CPU、內(nèi)存、吞吐量等。
PS: 因?yàn)樾」吘共皇菍I(yè)的測(cè)試人員,這里只是做了一些簡(jiǎn)單的測(cè)試,對(duì) Flink 的性能有個(gè)大致的認(rèn)知即可。小伙伴們?nèi)绻行枰梢允褂脤iT的大數(shù)據(jù)測(cè)試工具,如 HiBench。
這里貼一篇美團(tuán)技術(shù)團(tuán)隊(duì)出品的文章《流計(jì)算框架 Flink 與 Storm 的性能對(duì)比》,有興趣的小伙伴可以看下:
https://tech.meituan.com/2017/11/17/flink-benchmark.html
好了,鋪墊了這么多,其實(shí)是想水文一篇,沒啥技術(shù)含量,就是給大家推薦第三方工具庫(kù) JavaCSV
,用來造一些 csv 測(cè)試數(shù)據(jù)文件,個(gè)人覺得它非常地優(yōu)雅方便 (比較偷懶~ 代碼量少~)。
JavaCSV 官網(wǎng)地址: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 犬小哈(公眾號(hào):小哈學(xué)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) { // 創(chuàng)建 CSV Writer 對(duì)象, 參數(shù)說明(寫入的文件路徑,分隔符,編碼格式) CsvWriter csvWriter = new CsvWriter(writeCsvFilePath,',', Charset.forName("GBK")); try { // 定義 header 頭 String[] headers = {"訂單號(hào)", "用戶名", "支付金額"}; // 寫入 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); } }
通過上面的示例代碼,我們就可以很輕松地造一批測(cè)試數(shù)據(jù),只需要改下需要生成的行數(shù)即可。相比較其他的庫(kù),代碼量還是非常少的。
運(yùn)行代碼,看下最終的效果圖:
2.1 讀文件
說完了如何通過 javacsv
來寫 csv 文件,再來說說如何讀取 csv 文件,就以上面生成的 csv 文件作為讀取源,示例代碼如下:
/** * @author 犬小哈(公眾號(hào):小哈學(xué)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) { // 緩存讀取的數(shù)據(jù) List<String[]> content = new ArrayList<>(); try { // 創(chuàng)建 CSV Reader 對(duì)象, 參數(shù)說明(讀取的文件路徑,分隔符,編碼格式) CsvReader csvReader = new CsvReader(readCsvFilePath, ',', Charset.forName("GBK")); // 跳過表頭 csvReader.readHeaders(); // 讀取除表頭外的內(nèi)容 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 列的數(shù)據(jù) 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); } }
運(yùn)行代碼,看下控制臺(tái)打印效果:
打完收工~
總結(jié)
本文小哈主要帶著大家了解了一下,如何通過第三方庫(kù) JavaCSV
來對(duì) csv 文件進(jìn)行讀寫操作,實(shí)際場(chǎng)景中可能應(yīng)用并不廣泛,更多還是使用統(tǒng)一的文件庫(kù),如阿里的 EasyExcel,EasyPOI 等, 小哈這里使用,也僅僅是為了造測(cè)試數(shù)據(jù)而已。
PS: 關(guān)于 EasyExcel 使用教程, 小伙伴可以看下小哈之前寫的一篇文章:《7 行代碼優(yōu)雅地實(shí)現(xiàn) Excel 文件生成&下載功能》
好了,水文結(jié)束,小伙伴們覺得有幫助記得點(diǎn)個(gè)再看哈~ 感謝感謝~ 下期見~
Ref
https://sourceforge.net/projects/javacsv/
http://javacsv.sourceforge.net/
到此這篇關(guān)于一文秒懂通過JavaCSV類庫(kù)讀寫CSV文件的技巧的文章就介紹到這了,更多相關(guān)JavaCSV類庫(kù)讀寫CSV文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Integration 實(shí)現(xiàn)消息驅(qū)動(dòng)的詳細(xì)步驟
Spring Integration是一個(gè)用于構(gòu)建消息驅(qū)動(dòng)的中間件輕量級(jí)框架,它提供了一種模型和工具,用于在Spring應(yīng)用程序中實(shí)現(xiàn)企業(yè)集成模式,這篇文章主要介紹了Spring Integration 實(shí)現(xiàn)消息驅(qū)動(dòng),需要的朋友可以參考下2024-05-05java使用jacob實(shí)現(xiàn)word轉(zhuǎn)pdf
這篇文章主要為大家詳細(xì)介紹了java使用jacob實(shí)現(xiàn)word轉(zhuǎn)pdf,通過調(diào)用模板文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12IDEA2023隱藏.idea和.iml文件的實(shí)現(xiàn)步驟
IDEA新建項(xiàng)目會(huì)自動(dòng)生成一個(gè).idea文件夾和.iml文件,本文主要介紹了IDEA2023隱藏.idea和.iml文件的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09使用java將動(dòng)態(tài)網(wǎng)頁(yè)生成靜態(tài)網(wǎng)頁(yè)示例
這篇文章主要介紹了使用java將動(dòng)態(tài)網(wǎng)頁(yè)生成靜態(tài)網(wǎng)頁(yè)示例,需要的朋友可以參考下2014-03-03java中將一個(gè)實(shí)體類復(fù)制到另一個(gè)實(shí)體類的3種方法示例
這篇文章主要給大家介紹了關(guān)于java中將一個(gè)實(shí)體類復(fù)制到另一個(gè)實(shí)體類的3種方法,所謂實(shí)體類就是一個(gè)擁有Set和Get方法的類,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Spring創(chuàng)建bean對(duì)象三種方式代碼實(shí)例
這篇文章主要介紹了Spring創(chuàng)建bean對(duì)象三種方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Java設(shè)置Access-Control-Allow-Origin允許多域名訪問的實(shí)現(xiàn)方法
這篇文章主要介紹了Java設(shè)置Access-Control-Allow-Origin允許多域名訪問的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10