Estoy tratando de analizar un archivo CSV con jackson-dataformat-csv
y quiero para mapear la columna numérica al tipo de número de 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");
}
Estoy esperando entryMap.get("age")
que debería ser una Number
, pero me da String
en su lugar.
Mi archivo CSV:
firstName,lastName,age
John,Doe,21
Error,Name,-10
Sé que CsvSchema
funciona bien con POJOs, pero necesito para procesar esquemas CSV arbitrarias, así que no puedo crear una nueva clase de Java para cada caso.
Cualquier forma de CSV de análisis en un mecanografiada Map
o Array
?
Puede utilizar univocidad-analizadores para este tipo de cosas. Es más rápido y de manera más flexible:
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");
}
Para obtener un mapa escrito, comunicar al analizador lo que es del tipo de las columnas que se está trabajando:
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();
}
Espero que esto ayude
Exención de responsabilidad: yo soy el autor de esta biblioteca. Es de código abierto y libre (licencia Apache 2.0)