3

解析に Apache Commons CSV を使用しますが、欠落している列を無視せず、例外をスローします。

このサンプルデータでは:

name age
Ali 35
John 25
Vahid 75

以下のコードrecord.get(DataColumns.surname)は をスローしjava.lang.IllegalArgumentException: Mapping for surname not found, expected one of [name, surname, age]ます。null、オプション、またはデフォルト値を返す必要があります。オプションはありますか?私はそれが可能であることを知っていますrecord.toMap().get(DataColumns.surname.name())が、そのパフォーマンスは良くありません:

...
enum DataColumns { name, surname, age }
...
Reader in = new BufferedReader(new FileReader(fileName));

try (CSVParser records = CSVFormat.TDF
                .withDelimiter(' ')
                .withIgnoreSurroundingSpaces()
                .withAllowDuplicateHeaderNames(false)
                .withIgnoreHeaderCase()
                .withTrim()
                .withHeader(DataColumns.class)
                .withFirstRecordAsHeader()
                .withSkipHeaderRecord()
                .withAllowMissingColumnNames(false)
                .withIgnoreEmptyLines()
                .parse(in)) {

   for (CSVRecord record : records) {
       String name = record.get(DataColumns.name);
       String surname = record.get(DataColumns.surname);
       Short age = Short.valueOf(record.get(DataColumns.age)); 
   }
}

...
4

2 に答える 2

1

を使用record.isMapped(columnName)して列が存在するかどうかを確認し、変数に記録して、すべての行を再度確認する必要がないようにすることができます。

別のオプションはrecords.getHeaderNames()、ループの前に一度使用して変数に格納することSet<String>ですSet<String> headerNames = new HashSet<>(records.getHeaderNames())

headerNames.contains(columnName)次に、呼び出して列が存在するかどうかを確認することにより、結果の変数をループ内で使用できます。

参照してください: https://javadoc.io/doc/org.apache.commons/commons-csv/latest/org/apache/commons/csv/CSVRecord.html

于 2019-11-27T13:31:04.427 に答える
0

メソッドがあります: record.get(String) 代わりに列挙型を指定しました。

record.get(DataColumns.name.name()) を試してください

于 2019-11-27T13:31:56.990 に答える