Jackson CsvParser を使用して csv ファイルを解析して、別のクラスのリストも含むオブジェクトにしようとしています。
したがって、最初の 2 列には親クラスにバインドする必要があるデータが含まれ、その後のデータは別のクラスにバインドする必要があります。
public class Person {
private String name;
private String age;
private List<CarDetails> carDetails;
//Getters+setters
}
public class CarDetails {
private String carMake;
private String carRegistration;
//Getters+setters
}
解析されるログは次のようになります。
John Doe, 30, Honda, D32GHF
または、2 台の車を所有するユーザーの別のログでは、次のようになります。
Jane Doe, 29, Mini, F64RTZ, BMW, T56DFG
データの最初の 2 項目を "Person" クラスに解析することは問題ありません。
CsvMapper mapper = new CsvMapper();
CsvSchema schema = CsvSchema.builder()
.addColumn("name")
.addColumn("age")
for(numberOfCars=2; numberOfCars!=0 ; numberOfCars--)
schema = schema.rebuild()
.addColumn("carMake")
.addColumn("carRegistration")
MappingIterator<Map.Entry> it = mapper
.reader(Person.class)
.with(schema)
.readValues(personLog);
List<Person> people = new ArrayList<Person>();
while (it.hasNextValue()) {
Person person = (Person) it.nextValue();
people.add(person);
}
しかし、CarDetails を解析する方法がわかりません。値を検索し、新しい CarDetails オブジェクトを作成して Person オブジェクトに追加できるようにする必要があるようですが、その情報を抽出する方法がわかりません。
私の解決策は次のとおりです。
List<Person> people = new ArrayList<Person>();
MappingIterator<Map<?,?>> it = mapper.reader(schema).withType(Map.class).readValues(personLog);
while(it.hasNextValue()) {
Person person = new Person();
CarDetails = new CarDetails();
Map<?,?> result = it.nextValue();
person.setName(result.get("name").toString());
carDetails.setCarMake(result.get("carMake").toString());
person.addCarDetails(carDetails);
people.add(person);
}