这是定义如何映射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;
}
}
的关键点需要注意这个类有:
- 使用公共noargs构造;这在Java中是默认的,所以不需要指定构造函数。
- 所有属性是私人的。
- 所有属性都有getter,即返回值为
getXxxx
的方法。
- 所有属性都有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);
这将返回的JavaBeanExample
List
,每行一个在你的文件。
但是,这有点不愉快,因为我们必须投下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
中投射单个元素。
非常感谢您的回答!我现在总算明白了:-),它的功能就像一个魅力,再次感谢 – j0hny
上面的实现不会跳空行 –
@山阳区为什么会这样呢?它们不应该存在于CSV文件中。 CSV是一种简单,扁平的表格数据格式。 CSV文件中的空白行不应该超过一组SQL查询结果中的空行。 –