イゴールLuzhanov:
私が使用してCSVファイルを解析しようとしているjackson-dataformat-csv
と私は、Number Java型に数値列をマップします。
CsvSchema schema = CsvSchema.builder().setUseHeader(true)
.addColumn("firstName", CsvSchema.ColumnType.STRING)
.addColumn("lastName", CsvSchema.ColumnType.STRING)
.addColumn("age", CsvSchema.ColumnType.NUMBER)
.build();
CsvMapper csvMapper = new CsvMapper();
MappingIterator<Map<String, Object>> mappingIterator = csvMapper
.readerFor(Map.class)
.with(schema)
.readValues(is);
while (mappingIterator.hasNext()) {
Map<String, Object> entryMap = mappingIterator.next();
Number age = (Number) entryMap.get("age");
}
私は期待していentryMap.get("age")
なければなりませんNumber
が、私が得るString
代わりに。
私のCSVファイル:
firstName,lastName,age
John,Doe,21
Error,Name,-10
私は知っているCsvSchema
のPOJOで罰金を動作しますが、私はすべてのケースのための新しいJavaクラスを作成することはできませんので、私は、任意のCSVスキーマを処理する必要があります。
型付きに解析CSVにどのような方法Map
かArray
?
ジェロニモBackes:
あなたは使用することができますunivocity-パーサをこの種のもののために。それはより速く、より柔軟な方法です。
var settings = new CsvParserSettings(); //configure the parser if needed
var parser = new CsvParser(settings);
for (Record record : parser.iterateRecords(is)) {
Short age = record.getShort("age");
}
入力されたマップを取得するには、あなたが作業している列のタイプが何であるかをパーサに教えます:
parser.getRecordMetadata().setTypeOfColumns(Short.class, "age" /*, and other column names*/);
//to get 0 instead of nulls when the field is empty in the file:
parser.getRecordMetadata().setDefaultValueOfColumns("0", "age", /*, and other column names*/);
// then parse
for (Record record : parser.iterateRecords(is)) {
Map<String,Object> map = record.toFieldMap();
}
お役に立てれば
免責事項:私はこのライブラリの作者です。これはオープンソースとフリー(Apache 2.0のライセンス)です