2010-11-12 3 views
1

Если у меня есть класс с непримитивными публичными членами, и я хочу заполнить их из файла CSV с помощью OpenCSV, как я могу это сделать? Я заметил, что OpenCSV имеет некоторые защищенные элементы, относящиеся к PropertyDescriptorsOpenCSV CSV to JavaBean

Так скажем, у меня есть класс Person, который имеет элемент адреса, и мой файл CSV содержит detailsd для каждого человека, включая их адрес ..

Person{ 

private String name; 

private Address al 

public void setAddress(Address a){..} 
public void setName(String name){..} 

} 

Addess{ 

private String line1; 
private String line2; 
private String postCode; 

. 
. 
. 

} 

CSV файл:

NAME  | ADDR1  | ADDR2  | PCODE ... 
John Smith |Some place | Some town | NW234 

Спасибо,

+2

Пример файла CSV, который вы отправили **, не является CSV **. CSV означает Comma Separated Value; похоже, что вместо запятых вы используете каналы ('|'). –

ответ

5

Вы проверили следующие FAQ question? Мне кажется, это то, что вы хотите сделать. Хотя я мог ошибаться.

Есть ли способ привязать файл CSV к списку Javabeans?

Да, есть.

Кайл Миллер добавил новый набор классов , чтобы позволить вам связать файл CSV в список JavaBeans на основе столбца имя, положение столбца или стратегии отображения пользовательских . Вы можете найти новые классы в пакете au.com.bytecode.opencsv.bean . Вот как вы можете отобразить на Java Bean на основе позиции поля в файле CSV :

ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy(); 
strat.setType(YourOrderBean.class); 
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean 
strat.setColumnMapping(columns); 
CsvToBean csv = new CsvToBean(); 
List list = csv.parse(strat, yourReader); 
+2

что здесь у вас? –

5

Я уверен, что вы уже давно перешел, но я опускаю в в то же время, и есть два способа справиться с этим. Вы можете либо переопределить CsvToBean.convertValue, либо CsvToBean.getPropertyEditor.

Классный способ, вероятно, переопределить getPropertyEditor и вернуть собственный PropertyEditor для вашего конкретного объекта. Быстрый и грязный путь был бы переопределить convertValue в анонимной форме класса, например:

CsvToBean<MyClass> csvToBean = new CsvToBean<MyClass>(){ 

    @Override 
    protected Object convertValue(String value, PropertyDescriptor prop) throws InstantiationException,IllegalAccessException { 

     if (prop.getName().equals("myWhatever")) { 
      // return an custom object based on the incoming value 
      return new MyWhatever((String)value); 
     } 

     return super.convertValue(value, prop); 
    } 
}; 

Это работает хорошо для меня с OpenCSV 2,3. Удачи!

Смежные вопросы