使用Apache Commons CSV用Java读写CSV

您所在的位置:网站首页 java写csv文件换行 使用Apache Commons CSV用Java读写CSV

使用Apache Commons CSV用Java读写CSV

2024-05-27 13:05| 来源: 网络整理| 查看: 265

介绍

这是一个简短系列的第二篇文章,该系列专门针对Java中的CSV读写库,并且是上一篇文章(Core Java中的CSV读写)的直接续篇。

Apache Commons CSV

Apache Commons CSV库是Apache Software Foundation的Java CSV解析器版本。 根据项目摘要,它试图"提供一个用于读取和写入各种类型CSV文件的简单界面"。

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

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

这些预定义的格式是:

RFC4180-由RFC 4180定义的逗号分隔格式。

默认-与RFC4180格式相似,但允许在数据行之间插入空行。如果在使用Apache Commons CSV库定义解析器时未另外指定,则使用此格式。

EXCEL-与RFC 4180类似,但是允许缺少列名,并且忽略空行。

TDF-CSV文件的预定义格式,用制表符(\t)而不是逗号分隔。

MYSQL-MySql的SELECT INTO OUTFILE和LOAD 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的:

123456CSVParser 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",以供本文将来参考:

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

12345678InputStreamReader 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还允许定义标题以进行解析。

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

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

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

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

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

123456public 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实现非常熟悉用户指南中推荐的方法。

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

CSVPrinter类实现了Flushable和Closeable接口,使其行为类似于常见Java Writer或StringWriter的扩展。

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

123CSVPrinter 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接受ResultSet作为其.withHeader()方法的参数:

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

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

除了ResultSet,.printRecords()方法还可以与Iterable Array或使用varArgs传递给该方法的字符串集合一起使用。

结论

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

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

但是,如果您确实需要涵盖多种格式,则Apache Commons是一个受信任的库,可以很好地维护和定期更新,并提供大量的Java Docs和开发人员文档以支持初学者。

在Core Java中读写CSV

使用OpenCSV在Java中读写CSV



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3