uniVocity-parsers 是一个开源的Java项目。 针对CSV/TSV/定宽文本文件的解析,它以简洁的API开发接口提供了丰富而强大的功能。后面会做进一步介绍。
和其他解析库有所不同,uniVocity-parsers以高性能、可扩展为出发点,设计了一套自有架构。基于这套架构,开发者可以构建出新的文件解析器。
1. 概述
作为一名Java开发者,我目前正在参与开发一个Web项目,该项目帮助通信运营商评估当前的网络,并给出解决方案。 在该项目中,CSV文件扮演着至关重要的角色,它是运营商网络数据的承载格式,这些数据包含宽带用户的实时在线状态(在线/离线),及其实时流量。 通常来讲,单个CSV文件可以达到1GB以上,包含上百万条记录。项目当前采用的CSV解析库为
JavaCSV。
随着运营商网络规模的扩张,以及系统监控周期的增加,CSV文件迅速变大。 项目组不得不解决超大CSV数据解析所带来的性能问题(甚至包括秒级的解析效率),以及业务变化带来的功能扩展受到限制的问题。
经过很多次的测试和分析,我们最终确定采用
uniVocity-parsers作为CSV文件解析库, 实践之后发现它确实解决了我们的问题。除了更好的性能和扩展性之外,该库还为开发者提供了简洁易懂的API、开发文档和教程。 对于高级的功能扩展诉求,官方提供对应的收费服务。
该项目托管在
Github上,截至目前,已有63个star和8个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库提供的特性不止这些,由于它在我们的项目中发挥了很大的作用,推荐你进一步了解。
分享到:
相关推荐
赠送jar包:univocity-parsers-2.5.9.jar; 赠送原API文档:univocity-parsers-2.5.9-javadoc.jar; 赠送源代码:univocity-parsers-2.5.9-sources.jar; 赠送Maven依赖信息文件:univocity-parsers-2.5.9.pom; ...
赠送jar包:univocity-parsers-2.7.3.jar; 赠送原API文档:univocity-parsers-2.7.3-javadoc.jar; 赠送源代码:univocity-parsers-2.7.3-sources.jar; 赠送Maven依赖信息文件:univocity-parsers-2.7.3.pom; ...
赠送jar包:univocity-parsers-2.5.9.jar; 赠送原API文档:univocity-parsers-2.5.9-javadoc.jar; 赠送源代码:univocity-parsers-2.5.9-sources.jar; 赠送Maven依赖信息文件:univocity-parsers-2.5.9.pom; ...
赠送jar包:univocity-parsers-2.7.3.jar; 赠送原API文档:univocity-parsers-2.7.3-javadoc.jar; 赠送源代码:univocity-parsers-2.7.3-sources.jar; 赠送Maven依赖信息文件:univocity-parsers-2.7.3.pom; ...
univocity-parsers-2.2.1.jar
使用univocity-parsers,我们可以方便地将Java对象转换为CSV格式,或者从CSV文件中解析数据。以下是使用该库创建CSV文件的基本步骤: 1. 添加依赖:在你的项目中,你需要引入univocity-parsers的Maven或Gradle依赖...
java读取tsv及csv文件,所需jar包.
综上所述,通过使用univocity-parsers库,我们可以在Java后端将数据导出为CSV文件,然后利用JSch库将生成的CSV文件安全地上传到SFTP服务器。这个过程涉及到了文件操作、网络传输和安全性等多个方面的知识,对于开发...
(1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...
(1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...
总结,读取和创建CSV文件是数据处理中的常见任务,使用第三方库如Apache Commons CSV和Univocity-Parsers可以简化工作。对于自动解析文件编码,虽然可以尝试利用库的检测功能,但在实际应用中,最好还是结合人工确认...
univocity-trader是一个开源交易框架,旨在使具有基本编程技能的任何人都可以有效地创建和测试用于买卖股票,加密货币或任何其他类型工具的交易算法。 使用此框架,您可以从提供公共API的任何交易所或交易平台中...
java实战开发1200例源码 ...,您需要为我们的存储库添加一个条目到您的pom.xml以获得univocity-1.0.7 jar。 < repositories > < repository > < id >univocity-releases</ id > < url >
uniVocity-kairosdb 带有自定义数据存储的示例项目,使能够访问 KairosDB 编码 创建自定义数据存储时,至少需要实现: 一个 一个和 自定义数据存储 我们在为 KairosDB 创建了自定义数据存储。 配置 一切就绪后,...
安装通过 npm install contentful-parsers 通过yarn add contentful-parsers解析器fieldsParser 可能是最常见的解析器。 这将获取一个Contentful响应(一个数组或单个项目),并解析这些项目以展平所有fields...
在Java编程中,CSV(Comma Separated Values)文件是一种常见的数据存储格式,它以逗号分隔每一列的数据,便于处理和交换表格类数据。本篇将详细讲解如何使用Java来读取、写入CSV文件,以及推荐的库和基本操作。 一...
在IT行业中,处理数据是日常任务之一,尤其是对于文本数据,如CSV(逗号分隔值)文件、制表符分隔的文件以及固定宽度格式的文件。这些文件类型广泛用于存储表格数据,便于分析、导入数据库或者进行各种计算。本篇...
Java中处理CSV文件,通常可以使用开源库,如Apache Commons CSV、OpenCSV或uniVocity的csv-parser。这些库提供API来轻松地读取、解析和操作CSV数据。以Apache Commons CSV为例,我们可以创建一个`CSVParser`实例,...