バグを見つけたと思います。あるいはそうではないかもしれませんが、SuperCSVはそれをうまく処理できません。
MapReaderを使用して41列のCSVファイルを解析しています。しかし、私はそのCSVを取得しています-そして、CSVを提供するWebサービスは1行を台無しにします。「見出し」行は、41個のセルを持つタブ区切りの行です。
また、「間違った行」は、36個のセルを持つタブ区切りの行であり、内容は意味がありません。
これは私が使用しているコードです:
InputStream fis = new FileInputStream(pathToCsv);
InputStreamReader inReader = new InputStreamReader(fis, "ISO-8859-1");
ICsvMapReader mapReader = new CsvMapReader(inReader, new CsvPreference.Builder('"','\t',"\r\n").build());
final String[] headers = mapReader.getHeader(true);
Map<String, String> row;
while( (row = mapReader.read(headers)) != null ) {
// do something
}
上記の行でmapReader.read(headers)を実行すると、例外が発生します。これは例外です:
org.supercsv.exception.SuperCsvException:
the nameMapping array and the sourceList should be the same size (nameMapping length = 41, sourceList size = 36)
context=null
at org.supercsv.util.Util.filterListToMap(Util.java:121)
at org.supercsv.io.CsvMapReader.read(CsvMapReader.java:79)
at test.MyClass.readCSV(MyClass.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
あなたは私が何をすべきだと思いますか?
1つの行が混乱しているという理由だけで、アプリケーション全体がクラッシュすることは望ましくありません。その行をスキップしたいと思います。