日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java中iterator_如何在Java中读取CSV文件-Iterator和Decorator的案例研究

發布時間:2023/12/3 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中iterator_如何在Java中读取CSV文件-Iterator和Decorator的案例研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java中iterator

在本文中,我將討論如何使用Apache Common CSV讀取CSV(逗號分隔值)文件。 從這個案例研究中,我們將學習如何在設計模式的上下文中使用IteratorDecorator來提高不同情況下的可重用性。 但是在開始之前,我想我必須先回答兩個問題。

  • 如果有太多關于如何讀取CSV文件的DIY帖子,我為什么需要第三方庫?
    的確,當您使用Google“ java csv解析器”時,您將獲得一些相關的帖子。 但是,即使您是初學者,也不會對這些膚淺的方法感到滿意。 當然使用BufferedReaderString 。 split()將成功解析一個典型的CSV文件,但是您將無法從中學到任何東西,除非使它變得多余。 另一方面,就像我在下面顯示的那樣,使用和研究Apache Common CSV將教您Design Pattern中的幾個主題,例如迭代器和裝飾器。
  • 為什么選擇Apache Common CSV,而不是其他?
    據我所知,Sourceforge或Google代碼上還有其他幾個庫。 但是,如果您仔細研究他們的代碼細節,請原諒我的批評,但它們都不是靈活和可管理的:有些過于簡單,無法滿足用戶的各種要求;有些則過于簡單。 其他人則過于復雜且難以使用。 此外,我遇到的大多數人都沒有商業友好型許可證。 您知道,有時確實會使用戶感到恐懼。
  • Apache Common CSV仍在沙箱中,這意味著當前沒有官方下載和穩定版本。 但是, 夜間構建可能可用。

    使用迭代器隱藏基礎表示

    讓我從一個示例CSV文件開始,其中每個記錄位于單獨的行中,并由換行符分隔。 第一行是標題,其中包含與文件中的字段相對應的兩個名稱COL1和COL2 。 文件的其余部分包含三個記錄,各字段之間用逗號分隔。

    COL1,COL2 a,b c,d e,f

    使用Apache Common CSV讀取此文件的代碼是:

    public void test() throws FileNotFoundException, IOException {CSVParser parser = new CSVParser(new FileReader("test.csv"), CSVFormat.DEFAULT.withHeader());for (CSVRecord record : parser) {System.out.printf("%s\t%s\n", record.get("COL1"), record.get("COL2"));}parser.close(); }

    CSVParser用于根據指定的格式解析CSV文件。 在這里,我將使用默認的CSVFormat以及不帶參數的withwitherer()設置。 這樣,解析器就可以將CSV文件的第一行作為標頭,并使record.get("COL1")有效。 CSVParser提供了一種讀取記錄的迭代方式。 在這里,我們遇到了第一個設計模式Iterator 。 它提供了一種順序訪問CSV文件記錄而不暴露其底層表示的方法,例如如何跳過注釋行以及如何將列名映射到字段值。 對于每個記錄,我們使用CSVRecord.get(String name)來按字段名稱檢索字段值。

    CSVRecord提供了多種訪問字段值的方式:按名稱或按索引。 如果您不確定該字段具有值或為空, CSVRecord.isSet(String name)可以在之前調用CSVRecord.isSet(String name) 。 如果只想檢查解析器是否定義了名稱,則調用CSVRecord.isMapped(String name) 。

    使用裝飾器允許不同的行為

    CSVFormat.DEFAULTCSVFormat.RFC4180遵循RFC4180格式。 因此,用雙引號引起來的字段也可以處理,例如

    "COL1","COL2" "a","b" "c","d" "e","f"

    在RFC4180中 ,CSV文件中的字段應以逗號分隔。 但是通常,該庫可以處理任意分隔符,例如TAB或空格。 為了使代碼可重復使用,該庫提供了一種創建自己的CSVFormat的方法

    CSVFormat format = CSVFormat.newFormat(',').withQuoteChar('"').withHeader();

    上面的格式與CSVFormat.DEFAULT相同。 在這里,我們遇到了另一個設計模式Decorator ,它允許將行為靜態或動態地添加到單個對象中,而不會影響同一類中其他對象的行為。 在CSVFormat的情況下,每個withXXX()方法都返回一個新的CSVFormat ,它與調用方相同,但修改了一個屬性。 這里的問題可能是為什么不返回自我參照呢 我認為這是因為后面的方法將使以下代碼失敗

    CSVFormat format = CSVFormat.newFormat(','); CSVFormat format1 = format.withQuoteChar('"'); CSVFormat format2 = format.withHeader();

    如果我們僅返回this , format1將等于format2 ,這絕對是我們現在所期望的。

    CSVFormat提供了非常靈活的方式來指定CSV格式。 可以在其javadoc中找到詳細信息,該文檔有據可查。 我們可以設置定界符,注釋開始標記,引號字符等。因此,對于以下CSV文件,其中用TAB分隔字段,并以#開頭注釋,

    COL1 COL2 # comments a b c d e f

    我們可以創建一個格式

    CSVFormat format = CSVFormat.newFormat('\t').withCommentStart('#').withIgnoreEmptyLines(true).withNullString("").withHeader();

    總之,開始使用Apache Common CSV來統一一個通用和簡單的界面,以便在ASL許可下讀寫CSV文件。 它仍然在沙箱中,但是可以靈活地滿足不同的需求。 最后,我想強調的是,閱讀復雜的代碼確實有助于提高編程技能。 因此,我強烈建議您閱讀此項目源代碼,它非常簡單但功能強大。

    參考: 如何用Java讀取CSV文件-我們的JCG合作伙伴 Peng Yifan在PGuru博客上進行的Iterator和Decorator案例研究 。

    翻譯自: https://www.javacodegeeks.com/2013/10/how-to-read-csv-files-in-java-a-case-study-of-iterator-and-decorator.html

    java中iterator

    總結

    以上是生活随笔為你收集整理的java中iterator_如何在Java中读取CSV文件-Iterator和Decorator的案例研究的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。