【问题标题】:SuperCSV Cellprocessor that depends on multiple columns依赖于多列的 SuperCSV Cellprocessor
【发布时间】:2013-12-10 11:06:12
【问题描述】:

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

基本上,我有一个 csv 文件,其中有一列仅在另一列设置为特定值时出现。 所以一个例子如下:

IsBirthDate,BirthDate

是的,1985 年 11 月 5 日

没有

是的,1999 年 12 月 1 日

没有

没有

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

没有,1968 年 12 月 9 日

干杯

【问题讨论】:

  • 您的 CSV 文件是否真的像您给出的示例一样具有可变列?或者在每个 No 行之后是否有尾随 ,
  • 它没有。所以“否”行实际上是“否”。还想说我需要在低级别进行大量异常处理并提供有关文件未解析原因的自定义详细报告,因此我决定手动编写解析 csv 文件所需的类。不过,库 supercsv 看起来仍然很棒。

标签: java csv supercsv


【解决方案1】:

似乎已经在 Super CSV 论坛上回答了这个问题: http://sourceforge.net/p/supercsv/feature-requests/25/#30a5

复制帖子以防链接失效:

我想您是在问是否可以验证 Items 是否具有 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", new IsValueIn(partNumbers)) 它适用于产品和项目,但它 文件末尾的包验证失败。

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

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多