いくつかの標準的な列といくつかの完全にランダムなフィールドを含むさまざまな CSV があります。
firstname, lastname, dog_name, fav_hat, fav_color
bill,smith,fido,porkpie,blue
james,smith,rover,bowler,purple
firstname, lastname, car_type, floor_number
tom, collins, ford, 14
jim, jones, toyota, 120
だから私はそれらを姓と名を保持する Person.class Bean に解析しようとしています。
2 つのクラスの概要:
class Person {
public String firstname;
public String lastname;
public List<PersonAttribute> attribs;
}
class PersonAttribute {
public Person p;
public String key; // header name, ex. 'car_type'
public String value; // column value, ex. 'ford'
}
opencsv で CsvToBean 関数を使用しています。
public static List<Person> parseToBeans(File csvFile, HashMap<String, String> mapStrategy, Class beanClass) throws IOException {
CSVReader reader = null;
try {
reader = new CSVReader(new BufferedReader(new FileReader(csvFile)));
HeaderColumnNameTranslateMappingStrategy<Person> strategy = new HeaderColumnNameTranslateMappingStrategy<>();
strategy.setType(beanClass);
strategy.setColumnMapping(mapStrategy);
final CsvToBean<Person> csv = new CsvToBean<Person>() {
@Override
protected Object convertValue(String value, PropertyDescriptor prop) throws InstantiationException, IllegalAccessException {
value = value.trim().replaceAll(" +", " ");
return super.convertValue(value, prop);
}
};
return csv.parse(strategy, reader);
}
...
ただし、Person.class Bean の csv を解析しているときに、PersonAttribute.class Bean の作成を処理する方法がわかりません。私はこの投稿に出くわし、私がやろうとしていることを簡単に処理するために supercsv に切り替える必要があるかどうか疑問に思っていますか?