看起来这已经回答了有关超级CSV论坛: http://sourceforge.net/p/supercsv/feature-requests/25/#30a5
复制的情况下,链接后出现故障:
我想你'询问您是否可以验证项目是否有 parentPartNumber,但跳过对产品的验证。这基本上是交叉验证(涉及多于1 列的验证)。
我能想到的与细胞来实现这一 处理器的唯一方法是编写检查在另一列中的值 定制的Cell处理器,并决定基于价值什么。每个 单元处理器都可以访问CsvContext
,其中包含原始的 (未处理)值。
所以你可以写一个处理器,如下面的 。如果给定列 (其中列号从1开始)中的值等于其预期值,则其行为与Optional
相同。否则,它只是委托给链中的下一个处理器。
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);
}
}
我取代了parentPartNumber列 新OptionalIfOtherColumnEquals(2, “产品”,新 IsValueIn(partNumbers)),它适用于产品和项目处理器的定义,但它 验证失败在文件末尾的软件包中。
我会离开 作为一个练习为你解决,但是你可以看到你可以通过 实现交叉验证,如果你真的需要的话。希望这可以帮助。
您的CSV文件实际上是否有像您提供的示例那样的可变列?或者每个No行后面都有一个尾随的','? –
它没有。因此,“否”行实际上是“否”。也想说我需要做很多低级别的异常处理,并提供定制的详细报告,说明为什么一个文件不解析,因此我决定手动编写解析csv文件所需的类。图书馆supercsv仍然看起来不错。 –