Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用超级CSV时,我可以获得其中存在验证错误的列号吗?_Java_Csv_Supercsv - Fatal编程技术网

Java 在使用超级CSV时,我可以获得其中存在验证错误的列号吗?

Java 在使用超级CSV时,我可以获得其中存在验证错误的列号吗?,java,csv,supercsv,Java,Csv,Supercsv,我正在使用超级CSV验证CSV文件 我以listReader.getRowNumber()的形式获取行号,但是有没有方法可以获取存在验证错误的列号?您当然可以。超级CSV抛出的函数有一个getContext()方法,该方法返回抛出异常时的值(您需要在调用read()时进行try/catch) 其中包含许多有用的信息,包括: 行号(从1开始)。这是文件的实际行号 行号(从1开始)。这(总是)与行号不同(一行可以跨多行!) 列编号(从1开始) 行源(在本例中,在应用单元处理器之前,每个列的标记化字

我正在使用超级CSV验证CSV文件

我以listReader.getRowNumber()的形式获取行号,但是有没有方法可以获取存在验证错误的列号?

您当然可以。超级CSV抛出的函数有一个
getContext()
方法,该方法返回抛出异常时的值(您需要在调用
read()
时进行try/catch)

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

  • 行号(从1开始)。这是文件的实际行号
  • 行号(从1开始)。这(总是)与行号不同(一行可以跨多行!)
  • 列编号(从1开始)
  • 行源(在本例中,在应用单元处理器之前,每个列的标记化字符串列表)
此外,您还可以调用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();
    }
}
ICsvListReader listReader=null;
试一试{
listReader=新的CsvListReader(新的文件阅读器(CSV_文件名),
CSVP(参考。标准优先);
listReader.getHeader(true);//跳过标题
最终单元处理器[]处理器=
新的CellProcessor[]{new Optional(),new ParseInt()};
列表行;
而((行=listReader.read(处理器))!=null){
System.out.println(String.format(“lineNo=%s,rowNo=%s,row=%s”),
listReader.getLineNumber(),listReader.getRowNumber(),row));
}
}捕获(最终超级SVE例外){
//这就是你想要的!
final CsvContext context=e.getContext();
System.out.println(String.format(
“lineNo=%s、rowNo=%s、colNo=%s出现错误”,
context.getLineNumber(),
context.getRowNumber(),
context.getColumnNumber());
}最后{
如果(listReader!=null){
listReader.close();
}
}

更新:

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

你当然可以。超级CSV抛出的函数有一个
getContext()
方法,该方法返回抛出异常时的值(您需要在调用
read()
时进行try/catch)

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

  • 行号(从1开始)。这是文件的实际行号
  • 行号(从1开始)。这(总是)与行号不同(一行可以跨多行!)
  • 列编号(从1开始)
  • 行源(在本例中,在应用单元处理器之前,每个列的标记化字符串列表)
此外,您还可以调用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();
    }
}
ICsvListReader listReader=null;
试一试{
listReader=新的CsvListReader(新的文件阅读器(CSV_文件名),
CSVP(参考。标准优先);
listReader.getHeader(true);//跳过标题
最终单元处理器[]处理器=
新的CellProcessor[]{new Optional(),new ParseInt()};
列表行;
而((行=listReader.read(处理器))!=null){
System.out.println(String.format(“lineNo=%s,rowNo=%s,row=%s”),
listReader.getLineNumber(),listReader.getRowNumber(),row));
}
}捕获(最终超级SVE例外){
//这就是你想要的!
final CsvContext context=e.getContext();
System.out.println(String.format(
“lineNo=%s、rowNo=%s、colNo=%s出现错误”,
context.getLineNumber(),
context.getRowNumber(),
context.getColumnNumber());
}最后{
如果(listReader!=null){
listReader.close();
}
}

更新:


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

我不明白你想说什么。我不明白你想说什么。