这是定义如何将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;
}
}
关于这门课需要注意的关键点是:
- 使用公共 noargs 构造函数;这是 Java 中的默认值,因此不需要指定构造函数。
- 所有属性都是私有的。
- 所有属性都有getter,即调用
getXxxx
返回它们的值的方法。
- 所有属性都有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);
这将为文件中的每一行返回一个List
of 。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
.