通过openCSV填充Javabean - 代码说明

j0h*_*hny 3 java opencsv

我刚开始使用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);
Run Code Online (Sandbox Code Playgroud)

它位于openCSV常见问题解答网站上,另外还有一个问题.问题是我无法找到规范对象ColumnPositionMappingStrategy应该是什么样子以及应该在strat.setType语句(YourOrder Bean.class)中传递的内容.setColumnMapping方法对我来说也是不行的,但我相信当我知道其余的时候,我可以自己想出一个...

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

提前致谢!

Bor*_*der 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

关于这个课程的关键点是:

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

现在; 第一种方法,setType获取bean的类.它使用它通过反射创建实例.在这种情况下,我们会打电话:

strat.setType(JavaBeanExample.class);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

String[] columns = new String[] {"name", "orderNumber", "id"};
strat.setColumnMapping(columns); 
Run Code Online (Sandbox Code Playgroud)

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

List list = csv.parse(strat, yourReader);
Run Code Online (Sandbox Code Playgroud)

这将返回一个ListJavaBeanExample,一个是在文件中的每一行.

但这有点令人不愉快,因为我们必须投射每个项目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);
}
Run Code Online (Sandbox Code Playgroud)

这里的不同之处在于我们ColumnPositionMappingStrategy使用尖括号告诉它的泛型类型.我们还告诉CsvToBean它的通用类型.这意味着当我们调用parse时List<JavaBeanExample>会返回一个; 即List知道它的通用类型.现在我们不必将个别元素强制转换为List.