Java 依赖于多列的超级处理器
我偶然发现了supercsv图书馆,它似乎是一个非常好的作品。 然而,我有一个问题,我无法用他们网站上提供的文档回答,我想知道这里是否有人可以帮忙 基本上,我有一个csv文件,它有一个列,只有当另一列设置为特定值时才会出现。 下面是一个例子: 是生日吗 是的,1985年5月11日 没有 是的,1999年1月12日 没有 没有 你明白我的意思了。有没有一种方法可以创建一个cellprocessor,当发现这样的行时,它可以考虑这种依赖关系并引发异常: 不,1968年9月12日Java 依赖于多列的超级处理器,java,csv,supercsv,Java,Csv,Supercsv,我偶然发现了supercsv图书馆,它似乎是一个非常好的作品。 然而,我有一个问题,我无法用他们网站上提供的文档回答,我想知道这里是否有人可以帮忙 基本上,我有一个csv文件,它有一个列,只有当另一列设置为特定值时才会出现。 下面是一个例子: 是生日吗 是的,1985年5月11日 没有 是的,1999年1月12日 没有 没有 你明白我的意思了。有没有一种方法可以创建一个cellprocessor,当发现这样的行时,它可以考虑这种依赖关系并引发异常: 不,1968年9月12日 欢呼声超级CSV论坛
欢呼声超级CSV论坛似乎已经回答了这个问题: 在链接关闭时复制帖子: 我想你是在问你是否可以验证物品是否有 parentPartNumber,但跳过产品的验证。这是 基本上是交叉验证(涉及1个以上的验证 列) 我能想到的唯一方法是用cell实现这一点 processors是编写一个自定义单元处理器来检查值 ,并根据该值决定要执行的操作。每一个 cell processor可以访问包含原始数据的
CsvContext
(未处理的)值
因此,您可以编写一个处理器,如
下列的如果给定列中的值
(其中列号从1开始)等于其预期值。
否则,它只会委托给链中的下一个处理器
包示例;
导入java.util.List;
导入org.supercsv.cellprocessor.Optional;
导入org.supercsv.cellprocessor.ift.cellprocessor;
导入org.supercsv.util.CsvContext;
public class optionalFotherColumnEquals扩展可选{
私有的最后一个int列;
私有最终客体价值不变;
公共选项其他列等于(int列,
对象常量(值){
超级();
this.column=列;
this.constantValue=constantValue;
}
公共选项其他列等于(int列,
对象常量值,
手机处理器(下一个){
超级(下一个);
this.column=列;
this.constantValue=constantValue;
}
@凌驾
公共对象执行(对象值,CsvContext上下文){
//未处理行
List row=context.getRowSource();
//如果其他列与值匹配,则为可选
if(row.get(column-1).equals(constantValue)){
返回super.execute(值、上下文);
}
//否则继续下一个处理器
返回next.execute(值、上下文);
}
}
我替换了parentPartNumber列的处理器定义
使用新选项,其他列等于(2,“产品”,新
IsValueIn(PartNumber)),它适用于产品和项目,但
文件结尾处的包验证失败
我要走了
这是你要解决的一个练习,但你可以看到你可以
如果必须的话,实现交叉验证。希望这有帮助
这似乎已经在超级CSV论坛上得到了回答: 在链接关闭时复制帖子: 我想你是在问你是否可以验证物品是否有 parentPartNumber,但跳过产品的验证。这是 基本上是交叉验证(涉及1个以上的验证 列) 我能想到的唯一方法是用cell实现这一点 processors是编写一个自定义单元处理器来检查值 ,并根据该值决定要执行的操作。每一个 cell processor可以访问包含原始数据的
CsvContext
(未处理的)值
因此,您可以编写一个处理器,如
下列的如果给定列中的值
(其中列号从1开始)等于其预期值。
否则,它只会委托给链中的下一个处理器
包示例;
导入java.util.List;
导入org.supercsv.cellprocessor.Optional;
导入org.supercsv.cellprocessor.ift.cellprocessor;
导入org.supercsv.util.CsvContext;
public class optionalFotherColumnEquals扩展可选{
私有的最后一个int列;
私有最终客体价值不变;
公共选项其他列等于(int列,
对象常量(值){
超级();
this.column=列;
this.constantValue=constantValue;
}
公共选项其他列等于(int列,
对象常量值,
手机处理器(下一个){
超级(下一个);
this.column=列;
this.constantValue=constantValue;
}
@凌驾
公共对象执行(对象值,CsvContext上下文){
//未处理行
List row=context.getRowSource();
//如果其他列与值匹配,则为可选
if(row.get(column-1).equals(constantValue)){
返回super.execute(值、上下文);
}
//否则继续下一个处理器
返回next.execute(值、上下文);
}
}
我替换了parentPartNumber列的处理器定义
使用新选项,其他列等于(2,“产品”,新
IsValueIn(PartNumber)),它适用于产品和项目,但
文件结尾处的包验证失败
我要走了
这是你要解决的一个练习,但你可以看到你可以
如果必须的话,实现交叉验证。希望这有帮助
您的CSV文件是否像您给出的示例那样具有可变列?或者在每个No行后面都有一个尾随的
,
?它没有。所以“No”行实际上是“No”。我还想说,我需要在低级别上进行大量异常处理,并提供CU
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);
}
}