我刚开始使用 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 应该是什么样子的规范,以及应该在 str.setType 语句(YourOrder Bean.class)中传递什么。 setColumnMapping 方法对我来说也很陌生,但我相信当我知道其余的时候我可以自己解决这个问题......

有没有人愿意更多地解释一下这段代码? openCSV 文档对我来说非常简短,因为我缺乏一些 Java 的基本知识(来自 PHP,它有很大的不同)

提前致谢!

最佳答案

这定义了如何将作为 CSV 行的 String[] 映射到 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;
    }
}

关于这个类需要注意的关键点是:
  • 使用公共(public) noargs 构造函数;这是 Java 中的默认设置,因此无需指定构造函数。
  • 所有属性都是私有(private)的。
  • 所有属性都有 getter,即返回其值的称为 getXxxx 的方法。
  • 所有属性都有 setter,即设置它们的值的称为 setXxxx 的方法。

  • 现在;第一个方法 setType 获取 bean 的类。它使用它通过 reflection 创建实例。在这种情况下,我们会调用:
    strat.setType(JavaBeanExample.class);
    

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



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

    在这种情况下,我们会调用
    String[] columns = new String[] {"name", "orderNumber", "id"};
    strat.setColumnMapping(columns);
    

    现在这一切都设置好了,我们可以通过调用来启动 OpenCSV
    List list = csv.parse(strat, yourReader);
    

    这将返回 ListJavaBeanExample ,文件中的每一行一个。

    但这有点令人不快,因为我们必须转换 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 它的泛型类型。这意味着当我们调用 parse 时会返回一个 List<JavaBeanExample>;即 List 知道其泛型类型。现在我们不必在 List 中转换单个元素。

    关于java - 通过 openCSV 填充 Javabean - 代码解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17259926/

    10-11 04:13