使用Super CSV时,我是否可以获得存在验证错误的列号?

时间:2013-08-20 09:51:26

标签: java csv supercsv

我正在使用Super CSV验证csv文件。

我得到的行号为listReader.getRowNumber(),但有没有办法可以获得有验证错误的列号?

1 个答案:

答案 0 :(得分:4)

你确定可以。超级CSV引发的SuperCsvException有一个getContext()方法,在抛出异常时会返回CsvContext(您需要在调用read()时尝试/捕获)。

这包含许多有用的信息,包括:

  • 行号(从1开始)。这是文件的实际行号。
  • 行号(从1开始)。这不是(总是)与行号相同(一行可以跨越多行!)
  • 列号(从1开始)
  • 行源(在本例中为应用单元处理器之前每列的标记化字符串列表)

此外,您还可以调用CsvReader的getUntokenizedRow()方法来获取原始未标记的CSV行。

例如

ICsvListReader listReader = null;
try {
    listReader = new CsvListReader(new FileReader(CSV_FILENAME),
        CsvPreference.STANDARD_PREFERENCE);

    listReader.getHeader(true); // skip the header

    final CellProcessor[] processors = 
            new CellProcessor[]{new Optional(), new ParseInt()};

    List<Object> row;
    while( (row = listReader.read(processors)) != null ) {
        System.out.println(String.format("lineNo=%s, rowNo=%s, row=%s",
            listReader.getLineNumber(), listReader.getRowNumber(), row));
    }

} catch (final SuperCsvException e){

    // here's what you're after!
    final CsvContext context = e.getContext();
    System.out.println(String.format(
        "something went wrong on lineNo=%s, rowNo=%s, colNo=%s",
        context.getLineNumber(), 
        context.getRowNumber(), 
        context.getColumnNumber()));

} finally {
    if( listReader != null ) {
        listReader.close();
    }
}

<强>更新

查看您添加的代码后,您似乎想捕获验证异常,而不仅仅是知道列号。如果是这样,你应该看看this question