当前位置: 首页 > 知识库问答 >
问题:

使用Univocity解析器验证解析的字段

单于庆
2023-03-14

我想知道在使用CsvRoutines包时,是否有方法检查和验证字段。基本上,如果第一列只有数字,我想处理一行,否则跳过/可能抛出异常。我猜2.7.0中发布的@Validate annotation可以实现这一点。但我想知道,是否有其他方法可以在早期版本(如2.5.9)中实现同样的效果?

共有1个答案

白腾
2023-03-14

这里是库的作者。除了更新到最新版本,没有其他方法。有什么特别的原因不能升级吗?

更新:您可以将@Parsed注释放在类的getter或setter上,并在其中执行验证。这可能是最干净的方式。例如:

class Test {

    private Integer number;

    //accepts a String here... so this is straight from the parser before it tries to convert anything into an integer - which lets you validate or throw a custom exception
    @Parsed
    void setNumber(String number){
        try{
            this.number = Integer.valueOf(number);
        } catch(NumberFormatException e){
            throw new IllegalArgumentException(number + " is not a valid integer");
        }
    }

}

另一种选择是使用自定义转换类。复制最新版本中使用的ValidatedConversion类的代码,然后创建如下子类:

public static class RangeLimiter extends ValidatedConversion {
    int min;
    int max;

    public RangeLimiter(String[] args) {
        super(false, false); //not null, not blank
        min = Integer.parseInt(args[0]);
        max = Integer.parseInt(args[1]);
    }

    protected void validate(Object value) {
        super.validate(value); //runs the existing validations for not null and not blank
        int v = ((Number) value).intValue();
        if (v < min || v > max) {
            throw new DataValidationException("out of range: " + min + " >= " + value + " <=" + max);
        }
    }
}

现在,在你的代码中,使用以下命令:

@Parsed(field = "number")
@Convert(conversionClass = RangeLimiter.class, args = {"1", "10"}) //min = 1, max = 10
public int number;

我没有对旧版本进行测试。我认为您可能需要在@Parse注释中设置标志ApplyDefaultConversion=false,并使您的转换类将String转换为int,以运行验证。

总而言之,仅仅升级到最新版本就可以轻松避免大量工作。

 类似资料:
  • 我如何在ItemReader中使用Univocity一次读取一行,仍然使用BeanProcessor将我的行自动解析为Java对象?

  • 我试图使用统一解析器来解析一个固定宽度格式的文件,该文件每行包含可变数量的固定宽度记录。 格式为记录id[6],子记录[3]的#,子记录[6] 期望的结果是有一个子记录数组。@链接注释似乎适用,但留档声明这仅适用于超文本标记语言解析器。 我目前的解决方案是将子记录解析为字符串,然后循环遍历每个记录,并在子记录字符串中插入换行符,然后重新解析。有没有一种方法可以使用univocity解析器来实现这一

  • 当取消序列化一个对象时,您可以使用JSON. parse中的恢复函数,就像在示例中一样。但是,您正在通过常量字符串中的名称访问对象的属性,从而失去了类型脚本的“控制”(例如,重构更改道具的名称不会反映在开关案例中)。 有没有更好的方法来使用typecript的可能性?

  • 问题内容: 我有一个XML文件,我需要在其中搜索特定的标签并更新其值。问题在于,使用Sax解析器是“必须的”。我必须通过“仅”使用Sax解析器来找到这些标签,dom stax j4dom dom4j解析器不在考虑范围之内。 我可以通过将xml文件转换为字符串并使用sax解析器对其进行解析并按对象附加新值来完成此任务吗?可以吗 或您会推荐什么? 问题答案: 这是一个有效的代码,只需添加缺少的导入。它

  • 问题内容: 我试图分几个步骤处理X509证书,并遇到了两个问题。我是JCE的新手,所以我还没有完全了解最新信息。 我们希望能够基于不同的编码(PEM,DER和PCKS7)解析几个不同的X509证书。我已经使用FireFox 从https://belgium.be以PEM和PCKS7格式导出了相同的证书(证书包括链)。我已经省略了几行不需要的问题 只要我使用FileInputStream而不是PCK

  • 下一步是验证这些证书链。1)检查所有证书是否有有效日期(简单)2)使用OCSP验证证书链(如果在证书中没有发现OCSP URL,则返回CRL)。 我使用的是Sun JCE,但似乎没有那么多可用的文档(示例)? 我首先做了一个简单的实现,它只检查链,而不经过OCSP/CRL检查。 但是在OCSP.url属性中手动设置OCSP url之后,我得到了一个java.security.cert.certPa