OpenCSV CSV для JavaBean

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

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

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

Спасибо,

  • A

person Aodh    schedule 12.11.2010    source источник
comment
Опубликованный вами пример CSV-файла не является CSV. CSV означает значение, разделенное запятыми; похоже, вы используете трубы (|) вместо запятых.   -  person Matt Ball    schedule 12.11.2010
comment
CSV-файлы некоторое время использовали другие разделители, кроме запятой (,), чтобы сделать их более гибкими. Таким образом, вместо C в CSV можно было бы назвать CharacterSeparatedValues.   -  person kometen    schedule 31.01.2019


Ответы (2)


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

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

Да, есть.

Кайл Миллер добавил новый набор классов, позволяющий связать CSV-файл со списком компонентов JavaBeans на основе имени столбца, положения столбца или пользовательской стратегии сопоставления. Вы можете найти новые классы в пакете au.com.bytecode.opencsv.bean. Вот как вы можете сопоставить java-бин на основе позиций полей в вашем 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);
person extraneon    schedule 12.11.2010

Я уверен, что вы уже давно ушли, но я столкнулся с такой же ситуацией, и есть два способа справиться с ней. Вы можете переопределить 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. Удачи!

person Nathan Beach    schedule 13.09.2012