2013-06-23 63 views
3

我刚刚开始使用Java,并且有很多遗漏的知识,但我需要编写一个简单的类,它将使用openCSV将csv文件转换为JavaBean。我在这里找到了类似的排队的一些答案,但没有人能够帮助我。到目前为止,已经来到翻过这段代码:通过openCSV填充Javabean - 代码解释

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); 

它位于openCSV常见问题的网站,也正是在这里另外一个问题。问题是我找不到规范ColumnPositionMappingStrategy应该是什么样子,以及应该在strat.setType语句(YourOrder Bean.class)中传递什么。 setColumnMapping方法对我来说也是呃,但是我相信当我知道其余的时候我可以自己找出那一个...

有没有人会友善地解释这一点的代码? OpenCSV文档对我来说非常简短,因为我缺乏Java的一些基本知识(来自PHP,它有很大的不同)

在此先感谢!

回答

5

这是定义如何映射String[]那就是你的JavaBean的属性一排CSV的。

假设您有一个class像这样:

public class JavaBeanExample { 

    private Integer id; 
    private String name; 
    private Integer orderNumber; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getOrderNumber() { 
     return orderNumber; 
    } 

    public void setOrderNumber(Integer orderNumber) { 
     this.orderNumber = orderNumber; 
    } 
} 

的关键点需要注意这个类有:

  1. 使用公共noargs构造;这在Java中是默认的,所以不需要指定构造函数。
  2. 所有属性是私人的。
  3. 所有属性都有getter,即返回值为getXxxx的方法。
  4. 所有属性都有setter,即设置其值的方法setXxxx

现在;第一种方法setType采用你的bean的类。它使用它通过reflection创建实例。在这种情况下,我们呼吁:

strat.setType(JavaBeanExample.class); 

接下来,让我们假设我们有一个CSV的格式如下

名称,订单号和订单编号
李四,77777,00001
约翰·史密斯,77778,00002

因此,我们需要第一列第二映射到我们name财产,我们orderNumber亲第三个到id。我们使用bean中的属性名称来告诉OpenCSV要使用哪个设置器。 OpenCSV然后使用PropertyDescriptor通过相应命名的setter来设置属性。

在这种情况下,我们会打电话

String[] columns = new String[] {"name", "orderNumber", "id"}; 
strat.setColumnMapping(columns); 

这是现在所有设置,我们可以踢OpenCSV通过调用

List list = csv.parse(strat, yourReader); 

这将返回的JavaBeanExampleList,每行一个在你的文件。

但是,这有点不愉快,因为我们必须投下List中的每个项目。这是由于这个例子有点过时。下面是一个例子利用的generics,这个例子在用Java编写的7

final ColumnPositionMappingStrategy<JavaBeanExample> strategy = new ColumnPositionMappingStrategy<>(); 
strategy.setType(JavaBeanExample.class); 
strategy.setColumnMapping(new String[]{"name", "orderNumber", "id"}); 
final CsvToBean<JavaBeanExample> csvToBean = new CsvToBean<>(); 
final List<JavaBeanExample> beanExamples; 
try (final Reader reader = new FileReader("myFile.csv")) { 
    beanExamples = csvToBean.parse(strategy, reader); 
} catch (IOException ex) { 
    throw new RuntimeException(ex); 
} 

这里的区别是,我们用尖括号告诉ColumnPositionMappingStrategy的泛型类型。我们也告诉CsvToBean它的通用类型。这意味着当我们调用解析函数返回List<JavaBeanExample>时,即知道其通用类型的List。现在我们不必在List中投射单个元素。

+0

非常感谢您的回答!我现在总算明白了:-),它的功能就像一个魅力,再次感谢 – j0hny

+0

上面的实现不会跳空行 –

+0

@山阳区为什么会这样呢?它们不应该存在于CSV文件中。 CSV是一种简单,扁平的表格数据格式。 CSV文件中的空白行不应该超过一组SQL查询结果中的空行。 –