我遇到了supercsv库,这似乎是一件非常好的工作。 但是我有一个问题,我无法用他们网站上提供的文件回答,想知道这里是否有人可以提供帮助。
基本上我有一个csv文件,其列只有在另一列设置为特定值时才会出现。 以下是一个例子:
IsBirthDate,出生日期
是,第11/05/1985
没有
是12/01/1999
没有
没有
你明白我的意思。有没有办法创建一个可以考虑这种依赖关系的单元处理器,并在找到这样的行时抛出异常:
没有,12/09/1968
干杯
答案 0 :(得分:1)
似乎已经在Super CSV论坛上回答了这个问题: http://sourceforge.net/p/supercsv/feature-requests/25/#30a5
在案例链接中复制帖子会失败:
我想你是否可以验证项目是否有 parentPartNumber但跳过对产品的验证。这是 基本上是交叉验证(涉及超过1的验证) 柱)。
我能想到用细胞实现这一目标的唯一方法 处理器是编写一个检查价值的自定义单元处理器 在另一列中,根据值决定要执行的操作。一切 单元处理器可以访问包含raw的
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);
}
}
我替换了parentPartNumber列的处理器定义 使用新的OptionalIfOtherColumnEquals(2,“Product”,new IsValueIn(partNumbers)),它适用于产品和项目,但它 在文件末尾的Packages上验证失败。
我会离开 这是一个练习让你解决,但你可以看到你可以 如果你真的需要,实现交叉验证。希望这会有所帮助。