SuperCSV Cellprocessor依赖于多列

时间:2013-12-10 11:06:12

标签: java csv supercsv

我遇到了supercsv库,这似乎是一件非常好的工作。 但是我有一个问题,我无法用他们网站上提供的文件回答,想知道这里是否有人可以提供帮助。

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

IsBirthDate,出生日期

是,第11/05/1985

没有

是12/01/1999

没有

没有

你明白我的意思。有没有办法创建一个可以考虑这种依赖关系的单元处理器,并在找到这样的行时抛出异常:

没有,12/09/1968

干杯

1 个答案:

答案 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上验证失败。

     

我会离开   这是一个练习让你解决,但你可以看到你可以   如果你真的需要,实现交叉验证。希望这会有所帮助。