介绍

这是专门针对Java读写CSV的库的简短系列文章的第二篇,也是上一篇文章“ Core Java读写CSV”的直接续篇。

Apache Commons CSV

在Apache的百科全书CSV库是Apache软件基金会的版本在Java CSV解析器。根据项目摘要,它试图“提供一个用于读取和写入各种类型CSV文件的简单界面”。

与所有与Apache关联的库一样,它使用Apache许可证运行,这意味着可以自由使用,分发和修改它。

Apache Commons允许开发人员定义自己的格式,但是通过CSVFormat类提供了一组预定义的格式。

这些预定义的格式是:

  • RFC4180-由RFC 4180定义的逗号分隔格式。
  • 默认-与RFC4180格式相似,但是允许在数据行之间插入空行。如果在使用Apache Commons CSV库定义解析器时未另外指定,则使用此格式。
  • EXCEL-与RFC 4180类似,但是允许缺少列名,并且忽略空行。
  • TDF -CSV文件的预定义格式,用制表符(t)代替逗号分隔。
  • MYSQL -MySqlSELECT INTO OUTFILELOAD DATA INFILE操作支持的格式。
  • ORACLE -Oracle SQL加载程序使用的CSV格式。
  • INFORMIX_UNLOAD和INFORMIX_UNLOAD_CSV-定义为与IBM Informix可嵌入数据库一起使用的特殊格式。
  • MONGODB_CSV和MONGODB_TSV-与杨木NoSQL MongoDB数据库配合使用,分别用于逗号分隔和制表符分隔的值。
  • POSTGRESQL_CSV和POSTGRESQL_TEXT -PostgreSQL数据库支持的格式。

如果您需要一个非常简单的解决方案,则可能不适合使用Apache Commons CSV。该实现旨在提供最大的灵活性,这使源代码等于大约30,000行,并且在某些情况下很难理解。

但是,如果您确实需要涵盖多种格式,则Apache Commons是一个值得信赖的库,可以很好地进行定期维护和更新,其中包含大量的Java Docs和开发人员文档以支持初学者。

它包含在Maven Central存储库中,没有外部依赖关系。

使用Apache Commons CSV读取CSV

Apache Commons库提供了几种访问CSV文件中各个字段的方法。如果您使用的是Excel之类的应用程序,则Excel格式的CSV可能会有标题。

但是,如果您使用CSV作为基本的逗号分隔文本集,以便在系统之间传输数据或将其馈入另一个处理应用程序,则该文件可能包含从第一行本身开始的数据,而没有标题。Apache Commons CSV库考虑了这两种情况。

如果CSV文件不包含标题,或者不确定是否包含标题,则可以使用索引访问记录。由于CSVRecord实现了Java Iterable Interface,因此即使使用Excel和大多数其他应用程序打开CSV索引,其索引也从1开始,但索引是基于0的:

CSVParser csvParser = CSVFormat.DEFAULT.parse(new InputStreamReader(csvFile.getInputStream()));
for (CSVRecord record : csvParser) {String field_1 = record.get(0);String field_2 = record.get(1);...
}

如果您确定需要解析的CSV文件具有标题,并且知道处理前的标题格式,则可以使用标题列字符串来提取记录。

让我们考虑一个带有树数据的示例CSV文件,并将其称为“树数据CSV”,以供本文将来参考:

指数 周长(英寸) 高度(英尺) 体积(英尺)
1个 8.3 70 10.3

要引用数据的每一行,我们可以像上一个示例一样使用索引或列标题:

InputStreamReader input = new InputStreamReader(csvFile.getInputStream());
CSVParser csvParser = CSVFormat.EXCEL.withFirstRecordAsHeader().parse(input);
for (CSVRecord record : csvParser) {String field_1 = record.get("Index");String field_2 = record.get("Girth (in)");String field_3 = record.get("Height (ft)");String field_4 = record.get("Volume (ft)");
}

如果要读取不包含标题行的文件,想要定义自己的标题或使索引混乱,则Apache Commons还允许定义标题以进行解析。

.withFirstRecordAsHeader()您可以手动定义标题,而不是在定义CSV文件格式时使用该方法。例如,如果要避免在树数据文件的标题中引用度量单位,则可以重新定义标题以使用自己的字符串值:

CSVParser csvParser = CSVFormat.REF4180.withHeader("Index", "Girth", "Height", "Volume");
for (CSVRecord record : csvParser) {String field_2 = record.get("Girth");
}

如果您的CSV文件包含标题,但是您想定义自己的标题并跳过读取文件中的标题,请使用.readNext()以跳过第一行:

CSVRecord header = csvParser.readNext();
// read the other rows in a loop as usual

如果需要跨多个类使用定义,则也可以使用枚举来定义标头,如本示例所示:

public enum treeHeader {Index, Girth, Height, Volume
}
...
CSVParser csvParser = CSVFormat.DEFAULT.withHeader(treeHeader.class).parse(input);
// read rows

Apache Commons CSV库提供了一些其他方法来简化解析,包括:

  • .getRecordNumber() -返回分配给CSV文件中记录的编号。
  • .isConsistent() -可用于错误处理,根据当前记录的大小是否与标题行的大小匹配,返回True或False。
  • .size() -可用于确定记录中的值数。
  • .toString()-以字符串形式返回记录。当您需要将整个行存储为String以便以后进行处理,哈希或比较时很有用。

使用Apache Commons CSV编写CSV

Apache Commons CSV库主要集中于从CSV文件读取数据。在编写时,我们的核心Java实现非常熟悉用户指南中推荐的方法。

但是,还有一些有用的附加功能,例如在打印时定义标头以及直接从JDBCResultSet对象打印的功能。

CSVPrinter类实现FlushableCloseable接口,使得其行为类似于通常的Java的扩展WriterStringWriter

例如,生成我们的树数据CSV:

CSVPrinter csvPrinter = new CSVPrinter(stringWriter, CSVFormat.DEFAULT.withHeader("Index", "Girth", "Height", "Volume"));
csvPrinter.printRecord("1", "8.3", "70", "10.3");
csvPrinter.flush();

该方法.withHeader()接受标头的字符串值作为参数。

如果要生成不带标题的CSV,则可以直接使用new CSVPrinter(stringWriter, CSVFormat.DEFAULT);

如果要使用现有JDBC的列标题ResultSet进行打印,则Apache Commons CSV接受aResultSet作为其.withHeader()方法的参数:

CSVPrinter csvPrinter = CSVFormat.RFC4180.withHeader(treeDataResultSet).print(out);
csvPrinter.printRecords(treeDataResultSet);

如果CSVFormat您使用允许空行,则可以用来csvPrinter.println()在数据行之间打印空白行。

除了ResultSet,该.printRecords()方法还能够与工作可迭代数组集合字符串传递给该方法采用可变参数。

结论

Apache Commons CSV尝试提供一个简单的界面来读写各种类型的CSV文件。

该实现旨在提供最大的灵活性,这使得源代码在某些情况下很难理解。

但是,如果您确实需要涵盖多种格式,则Apache Commons是一个值得信赖的库,可以很好地进行定期维护和更新,其中包含大量的Java Docs和开发人员文档以支持初学者。

  • 在Core Java中读写CSV
  • 使用OpenCSV在Java中读写CSV

c++解析csv 存入数组_使用Apache Commons CSV在Java中读写CSV相关推荐

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

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

  2. python操作csv文件第7行开始的数据_Python教程-Python读写CSV文件

    前言 本教程学习在Python中使用CSV文件.CSV(逗号分隔值)格式是在电子表格和数据库中使用的非常流行的导入和导出格式.Python语言包含该模块,该模块具有用于读取和写入CSV格式的数据的类. ...

  3. c++解析csv 存入数组_Python读写csv文件专题教程(2)

    第275篇原创 上篇:Python读写csv文件专题教程(1) 2.3 通用解析框架 dtype 承接前文,test.csv读入后数据框如下: In [6]: df = pd.read_csv('te ...

  4. java中set怎么建int型_使用Array.setInt来填充Java中的数组

    为了填充Java中的数组,我们使用Array.setInt()方法.java.lang.reflect.Array.setInt(Object array,int index,int value)方法 ...

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

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

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

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

  7. java中接口什么时候用_我什么时候应该在java中使用接口?

    在Java中精确使用接口的一个很好的例子将是理想的,适用于任何特定的规则. 看看丹以前所有的问题,他似乎只是逐字逐句地张贴家庭作业/考试问题. 令人惊讶的是,这些不是考试题或其他-今天才找到这个网站, ...

  8. java aio为什么不稳定_为什么我不提倡在Java中使用static

    static从Java1.0开始便是Java中的关键字,用于表征静态属性或方法.它也得到了广泛的应用,在业务中定义XXXUtil是一种常规的模式,甚至是比较知名的类库(比如Apache Common ...

  9. java内存中读文件_关于内存管理:读取Java中的大文件

    我需要一个非常了解Java和内存问题的人的建议. 我有一个大文件(大约1.5GB),我需要将此文件切成许多小文件(例如100个小文件). 我通常知道如何做到这一点(使用BufferedReader), ...

最新文章

  1. live555 学习笔记
  2. GET和POST有什么区别?及为什么网上的多数答案都是错的
  3. c语言序列sequence,Sequence
  4. 物权法全文内容有哪些呢-广告外链_合肥SEO优化小编告诉您网站外链优化方法大全...
  5. cesium米转换经纬度_Cesium 坐标系转换
  6. 兰州大学2016年初试成绩基本要求
  7. neo4j jdbc中文乱码
  8. Python爬虫从入门到放弃(二十一)之 Scrapy分布式部署
  9. IIS7里的appcmd命令
  10. a href 与mysql_详解A标签中href=的几种用法
  11. 协方差检验用在什么地方_胶带还有什么隐藏功能,看看这几个,家里很多地方用得到...
  12. 天津90、北京54坐标和WGS84坐标
  13. 计算机exsl表f4代表锁定,(Excel中F4是什么键)笔记本锁定单元格f4怎么按
  14. win7共享网络的方法简述
  15. 图片的质量压缩和二次采样
  16. 双显示器如何设置上下显示和鼠标上下进入第二屏幕?
  17. docker redis安装使用
  18. k8s调度过程中的资源分配问题
  19. 雷达信号之脉冲压缩与占空比
  20. Python 爬取蜻蜓FM免费音频页面的音频

热门文章

  1. python怎么查找代码位置查询_Python查询IP地址归属完整代码
  2. 2020-12-06
  3. 《Python从小白到大牛》第4章 Python语法基础
  4. 12c adg添加数据文件报错处理ORA-01111
  5. JavaMail邮件发送不成功的那些坑人情况及分析说明
  6. linux下的rabbitmq安装与配置
  7. SDUTOJ [2801] 并查集模板
  8. 迄今为止程序员写过的最大Bug:亏损30亿、致6人死亡,甚至差点毁灭世界
  9. 某程序员哀叹:自己薪资远远超过了能力,想跳槽又怕外面接不住,怎么办?...
  10. 面试被问分布式事务(2PC、3PC、TCC),这样解释没毛病!