1

我正在使用最新版本的 common-csv 库,例如在我的pom.xml中,我有这个依赖项:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-csv</artifactId>
  <version>1.7</version>
</dependency>

该库用于在 Java 应用程序中编写简单的 CSV 文件。在特定用例中,可以复制 csv 文件的列名标题。我发现 CSVFormat 类的一个有趣属性在这种情况下一定很有用,但是在下面描述的每个解决方案中,程序都会因错误而终止,例如:

Exception in thread "main" java.lang.IllegalArgumentException: 
The header contains a duplicate entry: 'VV' in [CC, VV, VV]
  at org.apache.commons.csv.CSVFormat.validate(CSVFormat.java:1676)
  at org.apache.commons.csv.CSVFormat.<init>(CSVFormat.java:793)
  at org.apache.commons.csv.CSVFormat.withHeader(CSVFormat.java:1986)

编写的代码是:

public static void main(String[] args){
    CSVFormat formatCsv = CSVFormat.DEFAULT.withAllowDuplicateHeaderNames()
                                           .withHeader("CC","VV","VV");
    System.out.println(formatCsv);
}

我已经尝试了4种情况:

CSVFormat formatCsv = CSVFormat.DEFAULT.withAllowDuplicateHeaderNames()
                                       .withHeader(headers);

CSVFormat formatCsv = CSVFormat.DEFAULT.withAllowDuplicateHeaderNames(true)
                                       .withHeader(headers);

CSVFormat formatCsv = CSVFormat.DEFAULT.withHeader(headers)
                                       .withAllowDuplicateHeaderNames();

CSVFormat formatCsv = CSVFormat.DEFAULT.withHeader(headers)
                                       .withAllowDuplicateHeaderNames(true);

该属性是否存在错误withAllowDuplicateHeaderNames?重写库的代码源来改变CSVFormat.class的验证方法是非常困难的

4

1 回答 1

3

根据 1.7 版的来源,withAllowDuplicateHeaderNames()目前仅影响从数据本身读取的标头,而不影响您通过指定withHeader()的标头,您指定的标头当前始终检查重复项。

这已在 1.8 版中修复,另请参阅CSV-241和 PR #43

如果您使用的是旧版本,一种解决方法是从您提供的标头集合中过滤掉那些重复项。

于 2019-09-09T08:51:31.243 回答