这是一个很好的问题!作为一名超级 CSV 开发人员,我将研究在website.
您可以保持简单并使用 CsvListReader (它不关心有多少列),然后自己创建 Map :
public class HandlingExceptions {
private static final String INPUT =
"name\tage\nTom\t25\nAlice\nJim\t44\nMary\t33\tInvalid";
public static void main(String[] args) throws IOException {
// use CsvListReader (can't be sure there's the correct no. of columns)
ICsvListReader listReader = new CsvListReader(new StringReader(INPUT),
new CsvPreference.Builder('"', '\t', "\r\n").build());
final String[] headers = listReader.getHeader(true);
List<String> row = null;
while ((row = listReader.read()) != null) {
if (listReader.length() != headers.length) {
// skip row with invalid number of columns
System.out.println("skipping invalid row: " + row);
continue;
}
// safe to create map now
Map<String, String> rowMap = new HashMap<String, String>();
Util.filterListToMap(rowMap, headers, row);
// do something with your map
System.out.println(rowMap);
}
listReader.close();
}
}
Output:
{name=Tom, age=25}
skipping invalid row: [Alice]
{name=Jim, age=44}
skipping invalid row: [Mary, 33, Invalid]
如果您担心使用超级 CSVUtil
类(它可能会改变 - 它实际上是一个内部实用程序类),你可以按照我的建议组合 2 个阅读器here.
你可以尝试捕捉SuperCsvException
,但您最终可能会抑制的不仅仅是无效数量的列。我建议捕获的唯一超级 CSV 异常(尽管不适用于您的情况,因为您没有使用单元处理器)是SuperCsvConstraintViolationException
,因为它表明文件的格式正确,但数据不满足您的预期约束。