Apache Commons CSV 提供了多种访问记录值的方法。最简单的方法是通过记录中的索引访问值。但是,CSV 文件中的列通常有一个名称,例如:ID、CustomerNo、Birthday等。CSVFormat 类提供了用于指定这些标头名称的 API,而另一方面 CSVRecord 具有通过相应标头名称访问值的方法。
要按索引访问记录值,不需要对 CSVFormat 进行特殊配置:
Reader in = new FileReader("path/to/file.csv"); Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(in); for (CSVRecord record : records) { String columnOne = record.get(0); String columnTwo = record.get(1); }
索引可能不是访问记录值的最直观方式。因此,可以为文件中的每一列分配名称:
Reader in = new FileReader("path/to/file.csv"); Iterable<CSVRecord> records = CSVFormat.RFC4180.withHeader("ID", "CustomerNo", "Name").parse(in); for (CSVRecord record : records) { String id = record.get("ID"); String customerNo = record.get("CustomerNo"); String name = record.get("Name"); }
请注意,仍然可以使用它们的索引访问列值。
在整个代码中使用字符串值来引用列可能容易出错。出于这个原因,可以定义一个枚举来指定标题名称。请注意,枚举常量名称用于访问列值。这可能会导致枚举常量名称不遵循 Java 编码标准,即定义大写带下划线的常量:
(1)定义 Headers 枚举类
public enum Headers { ID, CustomerNo, Name }
(2)使用枚举定义标题
Reader in = new FileReader("path/to/file.csv"); Iterable<CSVRecord> records = CSVFormat.RFC4180.withHeader(Headers.class).parse(in); for (CSVRecord record : records) { String id = record.get(Headers.ID); String customerNo = record.get(Headers.CustomerNo); String name = record.get(Headers.Name); }
同样可以通过索引和使用字符串(例如 “CustomerNo”)访问值。
某些 CSV 文件在其第一条记录中定义标题名称。如果配置,Apache Commons CSV 可以从第一条记录解析标题名称:
Reader in = new FileReader("path/to/file.csv"); Iterable<CSVRecord> records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(in); for (CSVRecord record : records) { String id = record.get("ID"); String customerNo = record.get("CustomerNo"); String name = record.get("Name"); }
这将使用第一条记录中的值作为标题名称,并在迭代时跳过第一条记录。
要打印带有标题的 CSV 文件,请按以下格式指定标题:
final Appendable out = ...; final CSVPrinter printer = CSVFormat.DEFAULT.withHeader("H1", "H2").print(out);
要打印带有 JDBC 列标签的 CSV 文件,请按以下格式指定 ResultSet:
final ResultSet resultSet = ...; final CSVPrinter printer = CSVFormat.DEFAULT.withHeader(resultSet).print(out);