Java 依赖于多列的超级处理器

Java 依赖于多列的超级处理器,java,csv,supercsv,Java,Csv,Supercsv,我偶然发现了supercsv图书馆,它似乎是一个非常好的作品。 然而,我有一个问题,我无法用他们网站上提供的文档回答,我想知道这里是否有人可以帮忙 基本上,我有一个csv文件,它有一个列,只有当另一列设置为特定值时才会出现。 下面是一个例子: 是生日吗 是的,1985年5月11日 没有 是的,1999年1月12日 没有 没有 你明白我的意思了。有没有一种方法可以创建一个cellprocessor,当发现这样的行时,它可以考虑这种依赖关系并引发异常: 不,1968年9月12日 欢呼声超级CSV论坛

我偶然发现了supercsv图书馆,它似乎是一个非常好的作品。 然而,我有一个问题,我无法用他们网站上提供的文档回答,我想知道这里是否有人可以帮忙

基本上,我有一个csv文件,它有一个列,只有当另一列设置为特定值时才会出现。 下面是一个例子:

是生日吗

是的,1985年5月11日

没有

是的,1999年1月12日

没有

没有

你明白我的意思了。有没有一种方法可以创建一个cellprocessor,当发现这样的行时,它可以考虑这种依赖关系并引发异常:

不,1968年9月12日


欢呼声

超级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);
  }

}