ジャクソン・データ形式・CSV:POJOせずに数値のマッピング

イゴール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にどのような方法MapArray

ジェロニモ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のライセンス)です

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=210963&siteId=1