java中iterator

在本文中,我将讨论如何使用Apache Common CSV读取CSV(逗号分隔值)文件。 从这个案例研究中,我们将学习如何在设计模式的上下文中使用IteratorDecorator来提高不同情况下的可重用性。 但是在开始之前,我想我必须先回答两个问题。

  1. 如果有太多关于如何读取CSV文件的DIY帖子,我为什么需要第三方库?
    的确,当您使用Google“ java csv解析器”时,您将获得一些相关的帖子。 但是,即使您是初学者,也不会对这些肤浅的方法感到满意。 当然使用BufferedReaderStringsplit()将成功解析一个典型的CSV文件,但是您将无法从中学到任何东西,除非使它变得多余。 另一方面,就像我在下面显示的那样,使用和研究Apache Common CSV将教您Design Pattern中的几个主题,例如迭代器和装饰器。
  2. 为什么选择Apache Common CSV,而不是其他?
    据我所知,Sourceforge或Google代码上还有其他几个库。 但是,如果您仔细研究他们的代码细节,请原谅我的批评,但它们都不是灵活和可管理的:有些过于简单,无法满足用户的各种要求;有些则过于简单。 其他人则过于复杂且难以使用。 此外,我遇到的大多数人都没有商业友好型许可证。 您知道,有时确实会使用户感到恐惧。

Apache Common CSV仍在沙箱中,这意味着当前没有官方下载和稳定版本。 但是, 夜间构建可能可用。

使用迭代器隐藏基础表示

让我从一个示例CSV文件开始,其中每个记录位于单独的行中,并由换行符分隔。 第一行是标题,其中包含与文件中的字段相对应的两个名称COL1COL2 。 文件的其余部分包含三个记录,各字段之间用逗号分隔。

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();

如果我们仅返回thisformat1将等于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的案例研究相关推荐

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

    在本文中,我将讨论如何使用Apache Common CSV读取CSV(逗号分隔值)文件. 从这个案例研究中,我们将学习如何在设计模式的上下文中使用Iterator和Decorator来提高不同情况下 ...

  2. 读取csv文件 java_Java:逐步读取/流式传输CSV文件

    读取csv文件 java 我一直在做一些涉及读取CSV文件的工作,而我一直在使用OpenCSV ,而我的最初方法是逐行读取文件,解析内容并将其保存到地图列表中. 当文件的内容适合内存时,此方法有效,但 ...

  3. openCsv读取csv文件

    https://blog.csdn.net/cat_book_milk/article/details/52953786 Java读取csv文件 https://blog.csdn.net/galen ...

  4. java读取csv文件_使用扫描仪读取Java中的CSV文件

    java读取csv文件 We can use Java Scanner Class to read CSV File in java. 我们可以使用Java扫描程序类在Java中读取CSV文件. 读取 ...

  5. java删除csv一行_在Java中读取CSV文件时跳过第一行

    嘿家伙我正在编写解析器代码来读取.csv文件并将其解析为 XML.这是我的代码,它工作正常,但我希望它跳过文件中的第一行.所以我决定设置一个HashMap,但它似乎确实有效: for (int i = ...

  6. java读取csv文件的行数_JMeter 读取 CSV 文件数据行数

    在用 JMeter 做测试时,经常需要调用外部 CSV 文件的数据到脚本中使用,如果我们想对 CSV 文件中数据的行数进行统计,这个怎么做呢? 针对上面表格的数据,我们一起来学习一下如何统计数据行数吧 ...

  7. Java文件读写和CSV文件解析(读取csv文件的一列或若干列)

    文件类 Java 读文件流的知识不可少,先复习一下吧! OREACLE JDK8 DOCS 文件类是Java IO的一个对象,用于指定文件的相关信息,位置和名称信息.如txt文件,csv文件对Java ...

  8. python读取csv文件的方法-CSV文件在Python中的几种处理方式

    Comma Separated Values,简称CSV,它是一种以逗号分隔数值的文件类型.在数据库或电子表格中,它是最常见的导入导出格式,它以一种简单而明了的方式存储和共享数据,CSV文件通常以纯文 ...

  9. python打开并读取csv文件_!python3中使用使用read_csv( )读取csv文件,文件路径中含有中文,无法读取怎么处理?...

    python3如何根据csv文件的列的内容,自动建数据库表 你好,csv格式的和excel格式是差不多的, 下面是读取excel的一些函数,希望帮到你: # -*- coding: cp936 -*- ...

最新文章

  1. 机械行业 偏计算机,院校篇丨机械类:985机械不如二本计算机?
  2. 数据结构: 顺序存储二叉树
  3. 光纤与光缆有什么区别?—Vecloud微云
  4. 【通信原理】【实验】实验二:数字基带传输实验(GZHU)
  5. 2高并发服务器:多路IO之poll
  6. 详解Windows开机自动运行
  7. Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
  8. 飞畅 8口RS-485集线器产品性能参数介绍
  9. (90)FPGA十进制计数器设计-面试必问(十四)(第18天)
  10. 梦笔记2021-03-05
  11. sha1算法源码c版
  12. php第一季视频教程 李,李炎恢老师PHP系列课程第一季基础视频教程_PHP教程
  13. python实验报告代写_python 代写python作业、Directory代写python实验、python编程作业帮做 、代做python程序设计...
  14. 基于搜索的贝叶斯网络结构学习算法-K2
  15. FPGA功耗那些事儿(转载)
  16. BH1621FVC-TR光环境传感器
  17. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合
  18. MTK平台的LCM防静电(esd-check)机制
  19. 关于抓java的dump中live参数
  20. pymongo操纵MongoDB

热门文章

  1. 史上最全的 MySQL 高性能优化实战总结
  2. JavaFX UI控件教程(五)之Radio Button
  3. springboot项目不加端口号也可以访问项目的方法
  4. 日常技术分享 : 一定要注意replcaceAll方法,有时候会如你所不愿!
  5. 154. 寻找旋转排序数组中的最小值 II(有手就行)
  6. 自动配置原理---SpringBoot
  7. JAVA多线程总结(笔记)
  8. SELECT * FROM user WHERE username LIKE #{aaa}与SELECT * FROM user WHERE username LIKE '%${value}%'
  9. alertmanager 告警恢复_Prometheus配置企业微信告警
  10. 反射、HashMap、ArrayList与LinkedList区别