似乎已经在 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 验证失败。
我将把它作为一个练习留给你解决,但你可以看到,如果你真的需要,你可以实现交叉验证。希望这可以帮助。