java - 在使用 Super CSV 时,我可以获得验证错误的列号吗?

标签 java csv supercsv

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

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

最佳答案

你当然可以。 SuperCsvException Super CSV 抛出的有一个 getContext() 方法,它返回 CsvContext当抛出异常时(您需要围绕对 read() 的调用进行 try/catch)。

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

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

此外,您还可以调用getUntokenizedRow() CsvReader 的方法获取 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 .

关于java - 在使用 Super CSV 时,我可以获得验证错误的列号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18332027/

相关文章:

java - 在 Java 中生成数百万个随机字符串

java - 使用 IntelliJ 的 GlassFish 出现问题,部署不可用

java - 使用java和xsl将xml转换为csv时如何处理重复的节点名称

regex - 在 Vim 中排除与 ‘\%’ 的匹配?

java - 为什么在解析第一个字符串数组中的数据时会抛出异常,但在跳过第一个数组时不会抛出异常?

java - 格式化 Bean 生成器的 header 字段 - Java

Java - 将 hashmap 写入 csv 文件

java - 下拉功能在 selenium webdriver 中不起作用

java - 关闭服务器套接字