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);