Java 在使用超级CSV时,我可以获得其中存在验证错误的列号吗?
我正在使用超级CSV验证CSV文件 我以listReader.getRowNumber()的形式获取行号,但是有没有方法可以获取存在验证错误的列号?您当然可以。超级CSV抛出的函数有一个Java 在使用超级CSV时,我可以获得其中存在验证错误的列号吗?,java,csv,supercsv,Java,Csv,Supercsv,我正在使用超级CSV验证CSV文件 我以listReader.getRowNumber()的形式获取行号,但是有没有方法可以获取存在验证错误的列号?您当然可以。超级CSV抛出的函数有一个getContext()方法,该方法返回抛出异常时的值(您需要在调用read()时进行try/catch) 其中包含许多有用的信息,包括: 行号(从1开始)。这是文件的实际行号 行号(从1开始)。这(总是)与行号不同(一行可以跨多行!) 列编号(从1开始) 行源(在本例中,在应用单元处理器之前,每个列的标记化字
getContext()
方法,该方法返回抛出异常时的值(您需要在调用read()
时进行try/catch)
其中包含许多有用的信息,包括:
- 行号(从1开始)。这是文件的实际行号
- 行号(从1开始)。这(总是)与行号不同(一行可以跨多行!)
- 列编号(从1开始)
- 行源(在本例中,在应用单元处理器之前,每个列的标记化字符串列表)
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开始)
- 行源(在本例中,在应用单元处理器之前,每个列的标记化字符串列表)
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();
}
}
更新:
在查看添加的代码之后,您似乎希望捕获验证异常,而不仅仅是知道列号。如果是这样,你应该看看。我不明白你想说什么。我不明白你想说什么。