1

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

我得到了行号,listReader.getRowNumber()但是有没有一种方法可以让我得到存在验证错误的列号?

4

1 回答 1

4

你当然可以。Super CSV 抛出的SuperCsvExceptiongetContext()有一个方法,该方法在抛出异常时返回CsvContext(您需要在调用周围进行 try/catch 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();
    }
}

更新:

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

于 2013-08-20T11:35:29.650 回答