2010-11-12 71 views
1

如果我有一個非原始公共成員的類,並且我想使用OpenCSV從CSV文件填充它們,我該怎麼做?我注意到,OpenCSV沒有涉及的PropertyDescriptor一些保護成員OpenCSV CSV到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代表逗號分隔值;它看起來像你使用管道('|')而不是逗號。 – 2010-11-12 14:20:10

回答

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

你的讀物在這裏? – 2013-03-22 22:26:01

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。祝你好運!