2013-12-10 38 views
1

我遇到了supercsv库,它似乎是一个非常好的作品。 但是我有一个问题,我无法用他们网站提供的文档来回答,想知道这里有没有人可以提供帮助。取决于多列的SuperCSV Cellprocessor

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

IsBirthDate,出生日期

是11/05/1985

没有

是12/01/1999年

没有

你看我什么意思。有没有一种方法来创建一个cellprocessor,可以采取这种依赖关系考虑在内,这样当连续发现抛出一个异常:

号,12/09/1968年

干杯

+0

您的CSV文件实际上是否有像您提供的示例那样的可变列?或者每个No行后面都有一个尾随的','? –

+0

它没有。因此,“否”行实际上是“否”。也想说我需要做很多低级别的异常处理,并提供定制的详细报告,说明为什么一个文件不解析,因此我决定手动编写解析csv文件所需的类。图书馆supercsv仍然看起来不错。 –

回答

1

看起来这已经回答了有关超级CSV论坛: http://sourceforge.net/p/supercsv/feature-requests/25/#30a5

复制的情况下,链接后出现故障:

我想你'询问您是否可以验证项目是否有 parentPartNumber,但跳过对产品的验证。这基本上是交叉验证(涉及多于1 列的验证)。

我能想到的与细胞来实现这一 处理器的唯一方法是编写检查在另一列中的值 定制的Cell处理器,并决定基于价值什么。每个 单元处理器都可以访问CsvContext,其中包含原始的 (未处理)值。

所以你可以写一个处理器,如下面的 。如果给定列 (其中列号从1开始)中的值等于其预期值,则其行为与Optional相同。否则,它只是委托给链中的下一个处理器。

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, “产品”,新 IsValueIn(partNumbers)),它适用于产品和项目处理器的定义,但它 验证失败在文件末尾的软件包中。

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