1

我遇到了 supercsv 库,它似乎是一个非常好的工作。但是我有一个问题,我无法用他们网站上提供的文档来回答,想知道这里是否有人可以提供帮助。

基本上我有一个 csv 文件,其中有一列仅在另一列设置为特定值时出现。所以一个例子如下:

IsBirthDate,出生日期

是的,11/05/1985

是的,1999 年 12 月 1 日

你明白我的意思。有没有办法创建一个可以考虑这种依赖关系并在找到这样的行时抛出异常的单元处理器:

不,1968 年 12 月 9 日

干杯

4

1 回答 1

1

似乎已经在 Super CSV 论坛上回答了这个问题:http: //sourceforge.net/p/supercsv/feature-requests/25/#30a5

复制帖子以防链接失效:

我想你是在问你是否可以验证 Items 是否有 parentPartNumber 但跳过对 Products 的验证。这本质上是交叉验证(涉及超过 1 列的验证)。

我能想到的使用单元处理器实现此目的的唯一方法是编写一个自定义单元处理器,它检查另一列中的值,并根据该值决定要做什么。每个单元处理器都可以访问CsvContext,其中包含原始(未处理的)值。

因此,您可以编写如下所示的处理器。它的行为就像Optional给定列中的值(列号从 1 开始)等于它的预期值。否则,它只是委托给链中的下一个处理器。

package example;

import java.util.List;

import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.util.CsvContext;

public class OptionalIfOtherColumnEquals extends Optional {

  private final int column;

  private final Object constantValue;

  public OptionalIfOtherColumnEquals(int column, 
                                     Object constantValue) {
    super();
    this.column = column;
    this.constantValue = constantValue;
  }

  public OptionalIfOtherColumnEquals(int column, 
                                     Object constantValue, 
                                     CellProcessor next) {
    super(next);
    this.column = column;
    this.constantValue = constantValue;
  }

  @Override
  public Object execute(Object value, CsvContext context) {

    // unprocessed row
    List<Object> row = context.getRowSource();

    // optional if other column matches value
    if (row.get(column - 1).equals(constantValue)){
      return super.execute(value, context);
    }

    // otherwise continue to next processor
    return next.execute(value, context);
  }

}

我用 new OptionalIfOtherColumnEquals(2, "Product", new IsValueIn(partNumbers)) 替换了 parentPartNumber 列的处理器定义,它适用于 Products 和 Items,但在文件末尾的 Packages 验证失败。

我将把它作为一个练习留给你解决,但你可以看到,如果你真的需要,你可以实现交叉验证。希望这可以帮助。

于 2013-12-10T11:12:43.897 回答