化工原材料网站建设,优秀网页设计公司,在线免费看影视网站,深圳网站制作问java中iterator在本文中#xff0c;我将讨论如何使用Apache Common CSV读取CSV#xff08;逗号分隔值#xff09;文件。 从这个案例研究中#xff0c;我们将学习如何在设计模式的上下文中使用Iterator和Decorator来提高不同情况下的可重用性。 但是在开始之前#xff0c;我… java中iterator 在本文中我将讨论如何使用Apache Common CSV读取CSV逗号分隔值文件。 从这个案例研究中我们将学习如何在设计模式的上下文中使用Iterator和Decorator来提高不同情况下的可重用性。 但是在开始之前我想我必须先回答两个问题。 如果有太多关于如何读取CSV文件的DIY帖子我为什么需要第三方库 的确当您使用Google“ java csv解析器”时您将获得一些相关的帖子。 但是即使您是初学者也不会对这些肤浅的方法感到满意。 当然使用BufferedReader和String 。 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.getString 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文件。 它仍然在沙箱中但是可以灵活地满足不同的需求。 最后我想强调的是阅读复杂的代码确实有助于提高编程技能。 因此我强烈建议您阅读此项目源代码它非常简单但功能强大。 参考 如何用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.htmljava中iterator