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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

屏幕坏点检测图片_电视屏幕出现坏点?行家会这样做!

液晶电视经常会有几个亮点或暗点,这些通常被称为电视坏点。作为强迫症患者,面对这些屏幕坏点我们应该怎么做?下面跟小智聊聊这个问题吧!首先,坏点形成的原因首先是因为液晶屏幕由很多点组成,每个点由RGB三原…

python中int函数的用法浅析_Python中int()函数的用法浅析

int()是Python的一个内部函数Python系统帮助里面是这么说的>>> help(int)Help on class int in module __builtin__:class int(object)| int(x[, base]) -> integer|| Convert a string or number to an integer, if possible. A floating point| argument will be…

Java:GraalVM数据库流性能

GraalVM是JVM块的新成员。 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript。 GraalVM还有一个新的内部代码优化器管道,在某些情况下,与其他JVM相比,它可以显着提高性能。 了解如何…

kubelet启动失败_kubelet 架构浅析

一、概要kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器(PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象…

shell 提取sql 的字段名表名_SQL代码风格规范

作为新时代SQL Boy,大部分时间都是在写sql,很多时候看到别人写的代码实在是不规范,命名随便写,没有缩进,看起来很没有逻辑性,今天分享下我自己的一些规范,从这里修改而来。--名称:xx…

亚马逊ec2 实例删除_亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

亚马逊ec2 实例删除Amazon Web Services提供了12个月的免费使用期限,使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务,其中Web开发人员最关注EC2服务。 EC2是一项服务,通过停止和启动Windows和/或Linux的虚拟实例来提供可调…

carbondata与mysql_Apache CarbonData 1.4.0 中文文档

故障排除本教程旨在为正在构建,部署和使用 CarbonData 的用户和开发人员提供故障排除。当加载数据时,遇到 tablestatus.lock 问题:现象17/11/11 16:48:13 ERROR LocalFileLock: main hdfs:/localhost:9000/carbon/store/default/hdfstable/tablestatus.l…

使用混合多云每个人都应避免的3个陷阱(第4部分)

每天都在肆意宣传云,但每个人都应避免三个陷阱。 从云,混合云到混合多云,您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程,仔细研…

mysql语句使用_Mysql基本使用语句

数据库端口号:Mysql:3306 Orasle:1521 Sqlserver:1443DML: 数据操作语言(检索或者修改数据)DDl:数据定义语言(定义数据结构,比如创建、修改或删除数据库的对象)DCl:数据控制语言(用于定义数据库用户的权限)DML&#xf…

python getattr_Python中的getattr()函数详解:

标签:Python中的getattr()函数详解:getattr(object, name[, default]) -> valueGet a named attribute from an object; getattr(x, ‘y‘) is equivalent to x.y.When a default argument is given, it is returned when the attribute doesn‘texist; without …

python内核死亡的原因_Python的内核由于DLL而死亡

对于机器学习课程,我正在用python做练习。我们的作业必须使用Jupyter笔记本。虽然这在我的笔记本电脑和我的办公桌上运行得很好,但我不能在家里的桌面上运行任何东西。在因为我不确定是否允许我发布给我们的样板代码,我不会这样做。但无论如何…

Java,JavaFX的流畅设计风格拨动开关

嗨,这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来变得非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中,我谈到了切换开…

python登录页面_Python:简单的登陆GUI界面

import tkinterimport sysimport retop tkinter.Tk()top.geometry(‘400x170350150‘)top.wm_title(‘综合实例‘)def validateText():val entry1.get()if re.findall(‘^[0-9a-zA-Z_]{1,}$‘,str(val)):return Trueelse:label3[‘text‘] ‘用户名只能包含字母、数字、下划…

python解析多层嵌套json_Python爬虫解析多个嵌套JSON,多级,json

Python爬虫解析多级嵌套json最近刚接触Python爬虫,正好最近肺炎在全国蔓延,所以准备从网站爬取肺炎实时数据,并解析自己想要的数据。获取json数据网址为 https://m.look.360.cn/events/feiyan爬取网址:def main():urlhttps://m.lo…

python __call__一般用在哪些地方_Python __call__内置函数的作用和用法

开学了进入了实验室,需要协助大师兄做事,主要是OpenStack中的代码解析,但是涉及很多python高级用法,一时间有点麻烦,在做项目的同时慢慢更新博客。这次先写一下__call__的用法,因为经常看到它却不知道到底是…

如何使用vps 异地组网_使用ZEROTIER异地组建内网(局域网)

一、注册账号(该网站打开比较慢,但并不影响组网后的网速)二、建立虚拟局域网网(获取Network ID)1.选择菜单栏的Networks菜单2.选择创建网络3.注意获取到的Network ID(需要在每台组网的电脑上加入这个network id)4.大部分设置默认就可以了.三、下载软件点菜单中的Dow…

编写一个watchdog.sh脚本_五大原因!为何要将Jupyter Notebook转换为python脚本?

全文共3360字,预计学习时长9分钟图源:unsplash大多数数据科学在线课程都把Jupyter Notebook作为教学媒介,这是因为初学者在Jupyter Notebook的单元格中编写代码,比编写包含类和函数的脚本更容易。另一个原因在于它使浏览和绘制数据…

how2java_HOW-TO:在Spring 4和Java 7中使用@PropertySource批注

how2java今天,我将我当前正在从事的项目之一迁移到了Spring 4.0。 由于它是我用来学习和演示Spring功能的非常简单的Web应用程序,因此只需要更新项目的POM文件并更改Spring版本。 我将项目部署到Tomcat 7服务器,显然该应用程序未启动。 我在I…

掌握java_如何才算掌握Java,大家都掌握到什么程度

如何才算掌握Java SEjava SE基础课程在朗沃算是学完了,但真正的掌握了么?如何才算掌握了呢?目前已经进入了JavaWEB阶段的项目阶段,把这个问题提出来,是很好的一个时间,那么有没有一些参照觉得学Java基础部分…

IBM将收购Red Hat:面向Java的初衷

甲骨文公司近九年前完成了收购Sun Microsystems的过程。 那是当时的大新闻,今天也宣布了类似的大新闻: IBM和Red Hat已同意IBM收购Red Hat 。 IBM主页面宣布“ IBM收购Red Hat”。 然后它说:“这将改变一切。” 这项宣布的收购很可能会使许多…