java中iterator_如何在Java中读取CSV文件-Iterator和Decorator的案例研究
java中iterator
在本文中,我將討論如何使用Apache Common CSV讀取CSV(逗號分隔值)文件。 從這個案例研究中,我們將學習如何在設計模式的上下文中使用Iterator和Decorator來提高不同情況下的可重用性。 但是在開始之前,我想我必須先回答兩個問題。
的確,當您使用Google“ java csv解析器”時,您將獲得一些相關的帖子。 但是,即使您是初學者,也不會對這些膚淺的方法感到滿意。 當然使用BufferedReader和String 。 split()將成功解析一個典型的CSV文件,但是您將無法從中學到任何東西,除非使它變得多余。 另一方面,就像我在下面顯示的那樣,使用和研究Apache Common CSV將教您Design Pattern中的幾個主題,例如迭代器和裝飾器。
據我所知,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.DEFAULT或CSVFormat.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文件。 它仍然在沙箱中,但是可以靈活地滿足不同的需求。 最后,我想強調的是,閱讀復雜的代碼確實有助于提高編程技能。 因此,我強烈建議您閱讀此項目源代碼,它非常簡單但功能強大。
翻譯自: 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的案例研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大富翁安卓版单机(大富翁安卓版)
- 下一篇: 白煮蛋可以放几天(鸡蛋煮熟后保存放多久会