3

我刚开始使用 Java,并且缺少很多知识,但是我需要编写一个简单的类,它将使用 openCSV 的 csv 文件转换为 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,它有很大的不同)

提前致谢!

4

1 回答 1

7

这是定义如何将String[]CSV 的一行映射到JavaBean.

让我们假设你有一个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 的类。它使用它通过反射创建实例。在这种情况下,我们会调用:

strat.setType(JavaBeanExample.class);

接下来,让我们假设我们有以下格式的 CSV

姓名、订单号、订单 ID
Joe Bloggs, 77777, 00001
John Smith, 77778, 00002

所以我们需要将第一列映射到我们的name属性,第二列映射到我们的属性,orderNumber第三列映射到id. 我们使用 bean 中的属性名称来告诉 OpenCSV 使用哪个 setter。OpenCSV 然后使用 aPropertyDescriptor通过相应命名的 setter 设置属性。

在这种情况下,我们会调用

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

现在这一切都设置好了,我们可以通过调用来启动 OpenCSV

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

这将为文件中的每一行返回一个Listof 。JavaBeanExample

但这有点令人不快,因为我们必须在List. 这是因为这个例子有些过时了。这是一个使用泛型的示例,这个示例是用 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它的泛型类型。这意味着当我们调用 parse a 时List<JavaBeanExample>会返回;即List知道它的通用类型。现在我们不必在List.

于 2013-06-23T10:59:18.213 回答