uniVocity-parsers:一款强大的CSV/TSV/定宽文本文件解析库(Java)

uniVocity-parsers 是一个开源的Java项目。 针对CSV/TSV/定宽文本文件的解析,它以简洁的API开发接口提供了丰富而强大的功能。后面会做进一步介绍。

和其他解析库有所不同,uniVocity-parsers以高性能、可扩展为出发点,设计了一套自有架构。基于这套架构,开发者可以构建出新的文件解析器。

1. 概述

作为一名Java开发者,我目前正在参与开发一个Web项目,该项目帮助通信运营商评估当前的网络,并给出解决方案。 在该项目中,CSV文件扮演着至关重要的角色,它是运营商网络数据的承载格式,这些数据包含宽带用户的实时在线状态(在线/离线),及其实时流量。 通常来讲,单个CSV文件可以达到1GB以上,包含上百万条记录。项目当前采用的CSV解析库为JavaCSV

随着运营商网络规模的扩张,以及系统监控周期的增加,CSV文件迅速变大。 项目组不得不解决超大CSV数据解析所带来的性能问题(甚至包括秒级的解析效率),以及业务变化带来的功能扩展受到限制的问题。

经过很多次的测试和分析,我们最终确定采用uniVocity-parsers作为CSV文件解析库, 实践之后发现它确实解决了我们的问题。除了更好的性能和扩展性之外,该库还为开发者提供了简洁易懂的API、开发文档和教程。 对于高级的功能扩展诉求,官方提供对应的收费服务。

该项目托管在Github上,截至目前,已有69个star和10个fork。你可以在这里这里找到相关开发文档和教程,也可以在这里找到更多例子和新闻。

值得关注的是,Apache社区知名的开源项目Apache Camel也集成了uniVocity-parsers ,作为该项目解析CSV/TSV/定宽文本文件的推荐库。 更多信息请查看这里

2. 安装

我们项目组目前在用1.5.1版本, 推荐移步到uniVocity-parsers官方网站下载最新版本。

该项目同时也发发布在了Maven的中心仓库,因此也可以在你的pom.xml中直接添加如下代码:

<dependency>
<groupId>com.univocity</groupId>
<artifactId>univocity-parsers</artifactId>
<version>1.5.1</version>
</dependency>

3. 特性简介

uniVocity-parsers提供了一系列强大的功能,能够很好的满足你所有关于列表式数据的处理需求。如下图表展现了部分关键功能:

4. 读取列表式数据

读取CSV中的所有行

CsvParser parser = new CsvParser(new CsvParserSettings());
List<String[]> allRows = parser.parseAll(getReader("/examples/example.csv"));

如需查看文件写入相关的所有功能,请移步:https://github.com/uniVocity/univocity-parsers#reading-csv

5. 写入列表式数据

仅需2行代码,就可以完成CSV格式数据的写入:

List<String[]> rows = someMethodToCreateRows();

CsvWriter writer = new CsvWriter(outputWriter, new CsvWriterSettings());
writer.writeRowsAndClose(rows);

如需查看文件写入相关的所有功能,请移步: https://github.com/uniVocity/univocity-parsers/blob/master/README.md#writing

6. 性能与扩展性

如下为我们对比 uniVocity-parsers 和 JavaCSV 的测试对比表:

文件大小 JavaCSV解析耗时 uniVocity-parsers解析耗时
10MB, 145453 行 1138ms 836ms
100MB, 809008 行 23s 6s
434MB, 4499959 行 91s 28s
1GB, 23803502 行 245s 70s

这里可以查看几乎所有CSV解析库的性能对比分析表,从表中可以发现,uniVocity-parsers以绝对优势领先其他库。

uniVocity-parsers在性能和灵活性方面的优势得益于如下设计和机制:

  • 以单独线程读取数据(通过调用CsvParserSettings.setReadInputOnSeparateThread() 进行设置)
  • 并行的行数据处理器 (参考 RowProcessor 的实现类 ConcurrentRowProcessor)
  • 通过继承 ColumnProcessor 类来根据业务需求处理列数据
  • 通过继承 RowProcessor 类来根据业务需求处理行数据

7. 设计与实现

在uniVocity-parsers中,有一些核心的数据处理模块,他们负责对数据按行读写、按列读写,以及行列数据的转换。如下是这些核心模块的关系图:

你可以通过实现 RowProcessor 接口或者继承其实现类来开发自己的数据处理模块。如下代码中,我通过简单的内部匿名类开发了自己的数据处理模块。

CsvParserSettings settings = new CsvParserSettings();
settings.setRowProcessor(new RowProcessor() {

StringBuilder stringBuilder = new StringBuilder();

/**
* 处理第一行数据之前,你可以根据业务逻辑做相关初始化配置。
**/
@Override
public void processStarted(ParsingContext context) {
System.out.println("Started to process rows of data.");
}

/**
* 根据你的业务逻辑,处理行数据
**/
@Override
public void rowProcessed(String[] row, ParsingContext context) {
System.out.println("The row in line #" + context.currentLine() + ": ");
for (String col : row) {
stringBuilder.append(col).append("\t");
}
}

/**
* 所有行数据处理完成之后,做清理工作。
**/
@Override
public void processEnded(ParsingContext context) {
System.out.println("Finished processing rows of data.");
System.out.println(stringBuilder);
}
});

CsvParser parser = new CsvParser(settings);
List<String[]> allRows = parser.parseAll(new FileReader("/myFile.csv"));

uniVocity-parsers库提供的特性不止这些,由于它在我们的项目中发挥了很大的作用,推荐你进一步了解。

时间: 2024-10-23 18:56:00

uniVocity-parsers:一款强大的CSV/TSV/定宽文本文件解析库(Java)的相关文章

10 款强大的JavaScript图表图形插件推荐

转自:http://www.iteye.com/news/24535 网上有很多用于绘制图表图形的免费JavaScript插件和图表库,这类插件大量出现的原因,一是人们不再依赖于Flash,二是浏览器和精密的计算使呈现实时数据变得容易,而且各种向量绘图技术像VML.SVG和Canvas的发展也使之成为可能. 本文推荐10款强大的绘制图表图形的JavaScript插件.其中一些插件需要主流浏览器的支持,而另外一些经过整合后,也能在不同的平台和老版本的浏览器上工作.有些工具是独立的框架,大部分支持常

Stimulsoft Reports.Silverlight是一款强大的基于Silverlight平台的报表创建工具控件

Stimulsoft Reports.Silverlight是一款强大的基于Silverlight平台的报表创建工具控件.该产品有三个部分组成.第一部分是用于在Web浏览器中浏览和编辑的ASP.NET组件集.报表在服务器端渲染,在客户端进行显示和编辑报表.第二部分是基于Silverlight的功能齐全的报表工具,它只通过Silverlight来渲染,编辑,打印和导出报表.第三部分是一个用于WinForms平台的独立(独立的)的报表设计器.该部分是用于创建报表以及为能够进一步与其他组件一起使用 具

6款强大的 jQuery 网页布局创建及优化插件

本文将为您介绍6款功能强大的jQuery插件,它们能够帮助您方便快捷地创建复杂的网络布局并进行优化. 1.UI.Layout 该插件可以创建任何你想要的UI形式:包括从简单的标题或侧边栏,到一个包含工具栏,菜单,帮助面板,状态栏,子表格等复杂的应用.     2.jQUery Masonry 动态布局jQuery插件,折叠式CSS浮动面板. 3.jLayout 可提供四种网页元素布局算法.     4.jQuery pageSlide 该插件灵感来自于Aza Raskin的UI工作中.他最近发表

Viewer 是一款强大的 jQuery 图像浏览插件。

Viewer 是一款强大的 jQuery 图像浏览插件. 主要功能: 支持选项 支持方法 支持事件 支持触摸 支持移动 支持缩放 支持旋转 支持键盘 跨浏览器支持 链接: viewer的官方演示,及github上的开源代码. 使用方法: 1.引入css和js <link rel="stylesheet" href="css/viewer.min.css"> <script src="js/viewer.min.js">&l

分享一款强大的图片查看器插件,手机PC 通吃,功能超级齐全!

一款强大的图片查看器插件,手机PC 通吃,功能超级齐全! 地址:http://photoswipe.com/

.NET Core中的CSV解析库

感谢 本篇首先特别感谢从此启程兄的<.NetCore外国一些高质量博客分享>, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下. .NET Core中的CSV解析库 本篇博客来源于.NET Core Totorials的<CSV Parsing In .NET Core>. 背景介绍 对于初级程序员来说, 使用string.Split(',')来解析CSV文件基本就是唯一可行的方法, 但是之后他们会发现除了使用逗号分隔值之外,CSV中

一款强大的Android网络渗透软件dsploit

dSploit是一款基于Android系统的功能十分全面强大的网络渗透工具,可以提供给网络安全工作人员检查网络的安全性.小黑这次主要使用了其中的"简易嗅探""会话劫持""脚本注入"这三个功能.

推荐三款强大的Js图表库

1.百度的Echart ECharts,缩写来自Enterprise Charts,是百度推出的一款开源的,商业级数据图表,它最初是为了满足百度公司商业体系里各种业务系统(如凤巢.广告管家等等)的报表需求. 2.Highcharts 中文网站:http://www.hcharts.cn/ Highcharts是国外的一款功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯js图表库.Highcharts针对个人用户及非商业用途免费,商业用途需要购买授权. 3.阿里的G2 G2(The Gram

六款强大的开源数据挖掘工具推荐

当今这个大数据时代,数据就等于金钱.随着向一个基于应用的领域过渡,数据则呈现出了指数级增长.然而,百分之八十的数据是非结构化的,因此它需要一个程序和方法来从中提取有用信息,并且将其转换为可理解.可用的结构化形式. 在数据挖掘过程中,有大量的工具可供使用,比如采用人工智能.机器学习,以及其他技术等来提取数据. 以下为您推荐六款的数据挖掘工具: 1.WEKA WEKA 原生的非 Java 版本主要是为了分析农业领域数据而开发的.该工具基于 Java 版本,是非常复杂的,并且应用在许多不同的应用中,包