使用Apache Commons CSV用Java读写CSV |
您所在的位置:网站首页 › java写csv文件换行 › 使用Apache Commons CSV用Java读写CSV |
介绍
这是一个简短系列的第二篇文章,该系列专门针对Java中的CSV读写库,并且是上一篇文章(Core Java中的CSV读写)的直接续篇。 Apache Commons CSVApache 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读取CSVApache 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 rowsApache Commons CSV库提供了一些其他方法来简化解析,包括: .getRecordNumber()-返回分配给CSV文件中记录的编号。 .isConsistent()-可用于错误处理,根据当前记录的大小是否与标题行的大小匹配,返回True或False。 .size()-可用于确定记录中的值数。 .toString()-以字符串形式返回记录。 当您需要将整个行存储为String以便以后处理,哈希或比较时很有用。 使用Apache Commons CSV编写CSVApache 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 |