我遇到了supercsv库,这似乎是一件非常出色的工作。
但是,我有一个问题,我无法使用他们网站上提供的文档来回答,想知道这里是否有人可以提供帮助。
基本上,我有一个csv文件,该文件的一列仅在另一列设置为特定值时才出现。
因此,示例如下:
IsBirthDate,BirthDate
是的,1985年11月5日
没有
是的,1999年12月1日
没有
没有
你明白我的意思。有没有一种方法可以创建一个可以将这种依赖性考虑在内的单元处理器,并在发现这样的行时引发异常:
否,1968年12月9日
干杯
最佳答案
超级CSV论坛似乎已经回答了这样的问题:
http://sourceforge.net/p/supercsv/feature-requests/25/#30a5
复制帖子,以防链接断开:
我认为您是在问是否可以验证商品是否具有
parentPartNumber,但跳过对产品的验证。这是
本质上是交叉验证(涉及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);
}
}
我将处理器定义替换为parentPartNumber列
与新的OptionalIfOtherColumnEquals(2,“ Product”,新
IsValueIn(partNumbers)),它适用于产品和项目,但它
在文件末尾的包上验证失败。
我会离开
作为您解决的练习,但您可以看到可以
如果确实需要,请进行交叉验证。希望这可以帮助。